方法一:使用另一个实现类分装类的私有成员和函数,这种方法称为Pimpl方法。

test.h
None.gif #pragma once
None.gif#include 
" shared_ptr.hpp "
None.gif
class  CTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
public:
InBlock.gif    CTest(
void);
InBlock.gif    
~CTest(void);
InBlock.gif    
void DoSomething();
InBlock.gif
InBlock.gif
private:
InBlock.gif    
class CTestImp;
InBlock.gif    boost::shared_ptr
<CTestImp> pimpl_;
ExpandedBlockEnd.gif}
;

test.cpp
 
None.gif #include  " Test.h "
None.gif#include 
< iostream >
None.gif
None.gif
class  CTest::CTestImp
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
private:
ExpandedSubBlockStart.gifContractedSubBlock.gif    CTestImp(CTestImp 
const &)dot.gif{}
ExpandedSubBlockStart.gifContractedSubBlock.gif    CTestImp 
& operator=(CTestImp const &)dot.gif{}
InBlock.gif
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    CTestImp()
dot.gif{}
InBlock.gif    
void DoSomething();
ExpandedBlockEnd.gif}
;
None.gif
None.gif
void  CTest::CTestImp::DoSomething()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// do something.
InBlock.gif
    std::cout<<"Imp class do something."<<std::endl;
ExpandedBlockEnd.gif}

None.gif
None.gifCTest::CTest(
void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    boost::shared_ptr
<CTestImp> pImp(new CTestImp);
InBlock.gif    pimpl_ 
= pImp;
ExpandedBlockEnd.gif}

None.gif
None.gifCTest::
~ CTest( void )
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}

None.gif
None.gif
void  CTest::DoSomething()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    pimpl_
->DoSomething();
ExpandedBlockEnd.gif}

方法二:使用抽象类来实现接口与实现的分离。

x.h 
None.gif #pragma once
None.gif#include 
< stdio.h >
None.gif#include 
" shared_ptr.hpp "
None.gif
using   namespace  boost;
None.gif
None.gif
class  X
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
public:
InBlock.gif    
virtual void f() = 0;
InBlock.gif    
virtual void g() = 0;
InBlock.gif
InBlock.gif
protected:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
~X() dot.gif{ printf("~X\n");}
ExpandedBlockEnd.gif}
;
None.gif
None.gifshared_ptr
< X >  createX();

x.cpp 
None.gif #include  " X.h "
None.gif#include 
< stdio.h >
None.gif
None.gif
class  X_impl:  public  X
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
private:
ExpandedSubBlockStart.gifContractedSubBlock.gif    X_impl()
dot.gif{};    
InBlock.gif    X_impl(X_impl 
const &);
InBlock.gif    X_impl 
& operator=(X_impl const &);
InBlock.gif
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
~X_impl()dot.gif{printf("~X_impl\n");};
InBlock.gif    
virtual void f()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      printf(
"X_impl.f()\n");
ExpandedSubBlockEnd.gif    }

InBlock.gif    
virtual void g()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      printf(
"X_impl.g()\n");
ExpandedSubBlockEnd.gif    }

InBlock.gif
private:
InBlock.gif    friend shared_ptr
<X> createX();
ExpandedBlockEnd.gif}
;
None.gif
None.gifshared_ptr
< X >  createX()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    shared_ptr
<X> px(new X_impl);
InBlock.gif    
return px;
ExpandedBlockEnd.gif}