C++中接口与实现分离的技术

来源:互联网  作者:StarLee
摘要:在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。…

上文还没有考虑到类与类之间的继承关系。下面我们就来具体的谈谈这个方面。

还是以上面提到的那篇文章中的例子来说明。

执行类:

lxImplement.h文件内容:

#include "lxTest.h"
class ClxImplement 
{
public:
  ClxImplement();
  ~ClxImplement();

void DoSomething();
private:
  ClxTest m_lxTest;

void lxTest();
};

lxImplement.cpp文件内容:

#include "lxImplement.h"
ClxImplement::ClxImplement()
{
}
ClxImplement::~ClxImplement()
{
}
void ClxImplement::lxTest()
{
  m_lxTest.DoSomething();
}
void ClxImplement::DoSomething()
{
  lxTest();
}

接口类:

lxExp.h文件内容:

//  前置声明
class ClxImplement;

class ClxExp 
{
public:
  ClxExp();
  virtual ~ClxExp();
 void DoSomething();
private:
  //  声明一个类ClxImplement的指针,不需要知道类ClxImplement的定义
  ClxImplement *m_pImpl;
};

lxExp.cpp文件内容:

//  在这里包含类ClxImplement的定义头文件
#include "lxImplement.h"
ClxExp::ClxExp()
{
  m_pImpl = new ClxImplement;
}
ClxExp::~ClxExp()
{
  if (m_pImpl)
      delete m_pImpl;
}
void ClxExp::DoSomething()
{
  m_pImpl->DoSomething();
}

但是,如果类ClxExp是另一个类的子类,而在类ClxExp中要调用基类的方法,那上面的方案就不行了。比如说,类ClxExp的基类是下面的样子:

class ClxInF
{
public:
  ClxInF();
  virtual ~ClxInF();

bool InitSet();

virtual void DoSomething();
};

相应的类ClxExp的声明变成了如下的形式:

class ClxExp : public ClxInF
{
public:
  ClxExp();
  virtual ~ClxExp();

void DoSomething();

private:
  ClxImplement *m_pImpl;
};

现在,假设我们必须在类ClxExp的DoSomething()方法中根据InitSet()的返回值来确定是否执行操作。最简单的实现方法是把类ClxExp的DoSomething()方法改成下面的样子:

void ClxExp::DoSomething()
{
  if (InitSet())
      m_pImpl->DoSomething();
}

【相关文章】好搜一下
修练8年:C++面向对象程序设计之体会

修练8年:C++面向对象程序设计之体会

六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近…