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

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

下面用一个最简单的例子来说明。

类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下:

lxTest.h文件内容:

class ClxTest
{
 public:
  ClxTest();
  virtual ~ClxTest();
  void DoSomething();
};


lxTest.cpp文件内容:

#include "lxTest.h"
#include <iostream>
using namespace std;
ClxTest::ClxTest()
{}
ClxTest::~ClxTest()
{}
void ClxTest::DoSomething()
{
 cout << "Do something in class ClxTest!" << endl;
}
////////////////////////////////////////////////////////////////////////////


lxExp.h文件内容:

#include "lxTest.h"
class ClxExp
{
 public:
  ClxExp();
  virtual ~ClxExp();
  void DoSomething();
 private:
  ClxTest m_lxTest;
  void lxTest();
};


lxExp.cpp文件内容:

#include "lxExp.h"
ClxExp::ClxExp()
{}
ClxExp::~ClxExp()
{}
// 其实该方法在这里并没有必要,我这样只是为了说明调用关系
void ClxExp::lxTest()
{
 m_lxTest.DoSomething();
}
void ClxExp::DoSomething()
{
 lxTest();
}


为了让用户能使用我们的类ClxExp,我们必须提供lxExp.h文件,这样类ClxExp的私有成员也暴露给用户了。而且,仅仅提供lxExp.h文件是不够的,因为lxExp.h文件include了lxTest.h文件,在这种情况下,我们还要提供lxTest.h文件。那样ClxExp类的实现细节就全暴露给用户了。另外,当我们对类ClxTest做了修改(如添加或删除一些成员变量或方法)时,我们还要给用户更新lxTest.h文件,而这个文件是跟接口无关的。如果类ClxExp里面有很多像m_lxTest那样的对象的话,我们就要给用户提供N个像lxTest.h那样的头文件,而且其中任何一个类有改动,我们都要给用户更新头文件。还有一点就是用户在这种情况下必须进行重新编译!

时间: 2024-08-17 16:49:26

C++中接口与实现分离的技术的相关文章

探讨ASP.NET 2.0中的Web控件改进技术

asp.net|web|控件 ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这些内容展开全面探讨. 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩;但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于

php 面向对象中接口 与多态性的用法

php教程 面向对象中接口 与多态性的用法 ,接口的方法名是show,继承接口的类中必须有show这个方法,要不然就会报错.也就是说接口的方法是假的,真正起作用的是在继承的类中的方法,就是因为这一点,所以我觉得,接口根php的抽象类有点像. <?php interface face1 {  const param = 'test';  public function show(); } class test implements face1 {  public function show()  

C#中接口多重继承的注意事项

经常,一个类会实现多个接口,比如用户的一个控件继承自"IEdit"和"ICombo",每个接口无疑都有一个Paint方法来供子类实现如何画他们,但是多重继承就会出现问题,默认情况下,C#止允许实现Paint方法.现在有一个比较钻牛角尖的问题,如何在派生的类里面实现这两个接口的相同名称的方法呢? 通过试验,翻阅MSDN,我总结了这么几条规律: 本文可参考 MSDN 配合理解 1.要么只实现一个方法,否则函数重明,就会存在二义性 2.如果确实想两个方法都实现,必须在接口

Java中接口和抽象类的区别与相同之处

  这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念.接口的概念.接口和抽象类的区别与联系等内容,需要的朋友可以参考下 1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的起点. (2).格式: 代码如下: public abstract class abstractDemo{ /**属性*/ private Stri

java中接口没有构造方法那子类怎么访问他的数据

问题描述 java中接口没有构造方法那子类怎么访问他的数据 感觉跟以往学过的知识冲突了?哪位大神能伸出援手解答下?这个问题困扰我好久了,希望走过路过的不要错过哈! 解决方案 接口有什么数据?接口就是一个定义,不存任何数据. 解决方案二: 接口中没有任何函数,接口不是类,不能构造一个接口.只能构造一个实现了这个接口的函数. 解决方案三: 接口就是公共方法的集合,只有公有常量和抽象方法,数据是类的属性,只有类才可以定义私有成员变量的. 解决方案四: 接口,不能实例化,没有构造方法 解决方案五: 接口

浏览器和服务器在基于https进行请求链接到数据传输过程中,用到了哪些技术(多选)?

问题描述 浏览器和服务器在基于https进行请求链接到数据传输过程中,用到了哪些技术(多选)? 解决方案 1,2,3,4全都有 解决方案二: 签名指纹用的是sha1或sha256,以后都是sha256了

java中接口的实现类有的命名为XxxSupport,请问这个Support是什么意思,和XxxImpl意义相同吗

问题描述 如题:java中接口的实现类有的命名为XxxSupport,请问这个Support是什么意思,和XxxImpl意义相同吗,请问这是什么模式或者思想 解决方案 Support 一般是抽象类,里边存放子类可复用的东西 共性如 struts2的ActionSupport spring的 ***DaoSupporthttp://jinnianshilongnian.iteye.com/blog/1685963Impl表示实现:是个性 即细节实现,不同的Impl里边的算法可能不一样 但都是完成同

codeblock中C++程序的分离编译错误

问题描述 codeblock中C++程序的分离编译错误 我写了一个类方法声明和实现分离的c++程序,用vc6.0正常运行.用codeblock时编译时出现错误,报出找不到方法.怎么来解决这个问题?事先声明,我没有用模版. 解决方案 源代码文件有没有都包含进来,include .h文件是提示找不到文件还是报错?贴出具体的错误原因 解决方案二: 编辑器配置是不是没对. 解决方案三: 不知道你的编译器的版本是什么版本的?VC6.0是C++11标准出之前的编译器.codeblocks不知道你的编译器是什

vc#-VC#中接口也能new么?new一个方法是什么意思?

问题描述 VC#中接口也能new么?new一个方法是什么意思? VC#中接口也能new么?new一个方法是什么意思?new和override的区别 解决方案 接口不能new,但是可以new一个接口的实现类. 比如 interface I {} class A : I {} I a = new A(); new修饰方法,表示这个方法不是继承基类的,而是定义一个无关的同名的方法.override是函数重写.基类需要有一个对应的虚方法.