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

test.h
C++接口与实现分离的2种方法_分离#pragma once
C++接口与实现分离的2种方法_分离#include 
"shared_ptr.hpp"
C++接口与实现分离的2种方法_分离
class CTest
C++接口与实现分离的2种方法_休闲_04
{
C++接口与实现分离的2种方法_休闲_07
public:
C++接口与实现分离的2种方法_休闲_07    CTest(
void);
C++接口与实现分离的2种方法_休闲_07    
~CTest(void);
C++接口与实现分离的2种方法_休闲_07    
void DoSomething();
C++接口与实现分离的2种方法_休闲_07
C++接口与实现分离的2种方法_休闲_07
private:
C++接口与实现分离的2种方法_休闲_07    
class CTestImp;
C++接口与实现分离的2种方法_休闲_07    boost::shared_ptr
<CTestImp> pimpl_;
C++接口与实现分离的2种方法_分离_15}
;

test.cpp
 
C++接口与实现分离的2种方法_分离#include "Test.h"
C++接口与实现分离的2种方法_分离#include 
<iostream>
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离
class CTest::CTestImp
C++接口与实现分离的2种方法_休闲_20
{
C++接口与实现分离的2种方法_休闲_07
private:
C++接口与实现分离的2种方法_分离_24    CTestImp(CTestImp 
const &){}
C++接口与实现分离的2种方法_分离_27    CTestImp 
& operator=(CTestImp const &){}
C++接口与实现分离的2种方法_休闲_07
C++接口与实现分离的2种方法_休闲_07
public:
C++接口与实现分离的2种方法_休闲_32    CTestImp()
{}
C++接口与实现分离的2种方法_休闲_07    
void DoSomething();
C++接口与实现分离的2种方法_分离_15}
;
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离
void CTest::CTestImp::DoSomething()
C++接口与实现分离的2种方法_休闲_39
{
C++接口与实现分离的2种方法_休闲_07    
// do something.
C++接口与实现分离的2种方法_休闲_07
    std::cout<<"Imp class do something."<<std::endl;
C++接口与实现分离的2种方法_分离_15}

C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离CTest::CTest(
void)
C++接口与实现分离的2种方法_职场_47
{
C++接口与实现分离的2种方法_休闲_07    boost::shared_ptr
<CTestImp> pImp(new CTestImp);
C++接口与实现分离的2种方法_休闲_07    pimpl_ 
= pImp;
C++接口与实现分离的2种方法_分离_15}

C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离CTest::
~CTest(void)
C++接口与实现分离的2种方法_休闲_55
{
C++接口与实现分离的2种方法_分离_15}

C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离
void CTest::DoSomething()
C++接口与实现分离的2种方法_分离_61
{
C++接口与实现分离的2种方法_休闲_07    pimpl_
->DoSomething();
C++接口与实现分离的2种方法_分离_15}

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

x.h 
C++接口与实现分离的2种方法_分离#pragma once
C++接口与实现分离的2种方法_分离#include 
<stdio.h>
C++接口与实现分离的2种方法_分离#include 
"shared_ptr.hpp"
C++接口与实现分离的2种方法_分离
using namespace boost;
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离
class X
C++接口与实现分离的2种方法_分离_72
{
C++接口与实现分离的2种方法_休闲_07
public:
C++接口与实现分离的2种方法_休闲_07    
virtual void f() = 0;
C++接口与实现分离的2种方法_休闲_07    
virtual void g() = 0;
C++接口与实现分离的2种方法_休闲_07
C++接口与实现分离的2种方法_休闲_07
protected:
C++接口与实现分离的2种方法_分离_80    
~X() { printf("~X\n");}
C++接口与实现分离的2种方法_分离_15}
;
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离shared_ptr
<X> createX();

x.cpp 
C++接口与实现分离的2种方法_分离#include "X.h"
C++接口与实现分离的2种方法_分离#include 
<stdio.h>
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离
class X_impl: public X
C++接口与实现分离的2种方法_休闲_90
{
C++接口与实现分离的2种方法_休闲_07
private:
C++接口与实现分离的2种方法_休闲_94    X_impl()
{};    
C++接口与实现分离的2种方法_休闲_07    X_impl(X_impl 
const &);
C++接口与实现分离的2种方法_休闲_07    X_impl 
& operator=(X_impl const &);
C++接口与实现分离的2种方法_休闲_07
C++接口与实现分离的2种方法_休闲_07
public:
C++接口与实现分离的2种方法_休闲_101    
~X_impl(){printf("~X_impl\n");};
C++接口与实现分离的2种方法_休闲_07    
virtual void f()
C++接口与实现分离的2种方法_分离_105    
{
C++接口与实现分离的2种方法_休闲_07      printf(
"X_impl.f()\n");
C++接口与实现分离的2种方法_职场_109    }

C++接口与实现分离的2种方法_休闲_07    
virtual void g()
C++接口与实现分离的2种方法_休闲_111    
{
C++接口与实现分离的2种方法_休闲_07      printf(
"X_impl.g()\n");
C++接口与实现分离的2种方法_职场_109    }

C++接口与实现分离的2种方法_休闲_07
private:
C++接口与实现分离的2种方法_休闲_07    friend shared_ptr
<X> createX();
C++接口与实现分离的2种方法_分离_15}
;
C++接口与实现分离的2种方法_分离
C++接口与实现分离的2种方法_分离shared_ptr
<X> createX()
C++接口与实现分离的2种方法_职场_121
{
C++接口与实现分离的2种方法_休闲_07    shared_ptr
<X> px(new X_impl);
C++接口与实现分离的2种方法_休闲_07    
return px;
C++接口与实现分离的2种方法_分离_15}