C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

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


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

test.h
#pragma once
#include 
"shared_ptr.hpp"
class CTest
{
public:
    CTest(
void);
    
~CTest(void);
    
void DoSomething();

private:
    
class CTestImp;
    boost::shared_ptr
<CTestImp> pimpl_;
}
;

test.cpp

 

#include "Test.h"
#include 
<iostream>

class CTest::CTestImp
{
private:
    CTestImp(CTestImp 
const &){}
    CTestImp 
& operator=(CTestImp const &){}

public:
    CTestImp()
{}
    
void DoSomething();
}
;

void CTest::CTestImp::DoSomething()
{
    
// do something.
    std::cout<<"Imp class do something."<<std::endl;
}


CTest::CTest(
void)
{
    boost::shared_ptr
<CTestImp> pImp(new CTestImp);
    pimpl_ 
= pImp;
}


CTest::
~CTest(void)
{
}


void CTest::DoSomething()
{
    pimpl_
->DoSomething();
}


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

x.h 

#pragma once
#include 
<stdio.h>
#include 
"shared_ptr.hpp"
using namespace boost;

class X
{
public:
    
virtual void f() = 0;
    
virtual void g() = 0;

protected:
    
~X() { printf("~X\n");}
}
;

shared_ptr
<X> createX();

 
x.cpp 

#include "X.h"
#include 
<stdio.h>

class X_impl: public X
{
private:
    X_impl()
{};    
    X_impl(X_impl 
const &);
    X_impl 
& operator=(X_impl const &);

public:
    
~X_impl(){printf("~X_impl\n");};
    
virtual void f()
    
{
      printf(
"X_impl.f()\n");
    }

    
virtual void g()
    
{
      printf(
"X_impl.g()\n");
    }

private:
    friend shared_ptr
<X> createX();
}
;

shared_ptr
<X> createX()
{
    shared_ptr
<X> px(new X_impl);
    
return px;
}


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

posted on 2007-08-06 23:17 梦在天涯 阅读(10416) 评论(8)  编辑 收藏 引用 所属分类: CPlusPlus

评论

# re: C++接口与实现分离的2种方法 2007-08-07 22:59 pass86

听说boost::shared_ptr不大太让人信赖。  回复  更多评论   

# re: C++接口与实现分离的2种方法 2007-08-08 09:26 梦在天涯

啊,为什么啊,我常用的就是在vector等容器中使用shared_ptr代替auto_ptr。  回复  更多评论   

# re: C++接口与实现分离的2种方法 2007-08-09 13:44 cooleaf

基本上没有用过往容器里面扔过智能指针。还是直接用raw指针。  回复  更多评论   

# re: C++接口与实现分离的2种方法 2007-09-14 14:10 梦在天涯

第二种方法的create方法可以作为X class接口类的static方法!
第一种方法中,如果pimpl class需要访问CTest接口类基类的话,可以把pimpl class申明为CTest接口类的friendly类。

  回复  更多评论   

# re: C++接口与实现分离的2种方法 2007-11-12 17:37 fr3@K

在 CTest 里面用 boost::shared_ptr 保持 CTestImp 的指针会有问题. 这样会造成不同的 CTest 对象对应到同一个 CTestImp 对象.
CTest a;
CTest b(a);
也就是说 a.pimpl_.get() 会等於 b.pimpl_.get(). (假设 CTest::impl_ 为 public)

我想这不是你想要的结果.  回复  更多评论   

# re: C++接口与实现分离的2种方法[未登录] 2007-11-12 18:15 eXile

@fr3@K
这就要看CTest 是值语义还是指针语义了,对于指针语义,我觉得最好采用第二种接口类办法,这样概念上不会混淆,也便于将来派生新的功能。  回复  更多评论   

# re: C++接口与实现分离的2种方法[未登录] 2007-12-07 12:17 cppexplore

第一种方式比较奇怪啊,感觉毫无意义啊

增加功能的角度有adapter模式
隔离的角度有proxy模式

第二种是典型的接口

  回复  更多评论   

# re: C++接口与实现分离的2种方法 2007-12-15 22:22 飞行器

长见识!!!  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1744581
  • 排名 - 5

最新评论

阅读排行榜