C++接口与实现分离的2种方法 (C/C++)

轉貼自 http://www.cppblog.com/mzty/archive/2007/08/06/29441.html

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

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

test.cpp

 

 C++接口与实现分离的2种方法 (C/C++) #include  " Test.h "
 C++接口与实现分离的2种方法 (C/C++)#include 
< iostream >
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
class  CTest::CTestImp
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)
private:
 C++接口与实现分离的2种方法 (C/C++)    CTestImp(CTestImp 
const &){}
 C++接口与实现分离的2种方法 (C/C++)    CTestImp 
& operator=(CTestImp const &){}
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
public:
 C++接口与实现分离的2种方法 (C/C++)    CTestImp()
{}
 C++接口与实现分离的2种方法 (C/C++)    
void DoSomething();
 C++接口与实现分离的2种方法 (C/C++)}
;
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
void  CTest::CTestImp::DoSomething()
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)    
// do something.
 C++接口与实现分离的2种方法 (C/C++)
    std::cout<<"Imp class do something."<<std::endl;
 C++接口与实现分离的2种方法 (C/C++)}

 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)CTest::CTest(
void )
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)    boost::shared_ptr
<CTestImp> pImp(new CTestImp);
 C++接口与实现分离的2种方法 (C/C++)    pimpl_ 
= pImp;
 C++接口与实现分离的2种方法 (C/C++)}

 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)CTest::
~ CTest( void )
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)}

 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
void  CTest::DoSomething()
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)    pimpl_
->DoSomething();
 C++接口与实现分离的2种方法 (C/C++)}


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

x.h 

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


x.cpp 

 C++接口与实现分离的2种方法 (C/C++) #include  " X.h "
 C++接口与实现分离的2种方法 (C/C++)#include 
< stdio.h >
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
class  X_impl:  public  X
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)
private:
 C++接口与实现分离的2种方法 (C/C++)    X_impl()
{};    
 C++接口与实现分离的2种方法 (C/C++)    X_impl(X_impl 
const &);
 C++接口与实现分离的2种方法 (C/C++)    X_impl 
& operator=(X_impl const &);
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)
public:
 C++接口与实现分离的2种方法 (C/C++)    
~X_impl(){printf("~X_impl\n");};
 C++接口与实现分离的2种方法 (C/C++)    
virtual void f()
 C++接口与实现分离的2种方法 (C/C++)    
{
 C++接口与实现分离的2种方法 (C/C++)      printf(
"X_impl.f()\n");
 C++接口与实现分离的2种方法 (C/C++)    }

 C++接口与实现分离的2种方法 (C/C++)    
virtual void g()
 C++接口与实现分离的2种方法 (C/C++)    
{
 C++接口与实现分离的2种方法 (C/C++)      printf(
"X_impl.g()\n");
 C++接口与实现分离的2种方法 (C/C++)    }

 C++接口与实现分离的2种方法 (C/C++)
private:
 C++接口与实现分离的2种方法 (C/C++)    friend shared_ptr
<X> createX();
 C++接口与实现分离的2种方法 (C/C++)}
;
 C++接口与实现分离的2种方法 (C/C++)
 C++接口与实现分离的2种方法 (C/C++)shared_ptr
< X >  createX()
 C++接口与实现分离的2种方法 (C/C++)
{
 C++接口与实现分离的2种方法 (C/C++)    shared_ptr
<X> px(new X_impl);
 C++接口与实现分离的2种方法 (C/C++)    
return px;
 C++接口与实现分离的2种方法 (C/C++)}


总结:
       接口与实现的分离,有助于我们对代码实现的保护,特别是如果我们开发lib共别人使用使,更要注意。在实现分离的过程中,最好采用上面的第一种方法的智能指针boost::shared_ptr的实现,简单安全。

你可能感兴趣的:(c/c++)