数据隐藏在C ++中

我在C中有一些代码,它以这种方式使用不完整的结构(简化示例):

something.h

struct something; struct something *new_something(); int work_a(struct something *something); int work_b(struct something *something, const char *str); void free_something(struct something *something); 

somecode.c

 int some_function() { struct something *something; int x; something = new_something(); x = work_a(something); free_something(something); return x; } 

我在想,我基本上是在做C ++,为什么不尝试用C ++编写。 问题是(我是C ++的新手),我如何在C ++中实现相同的目标? 如果我尝试添加声明一个不完整类的成员函数,我得到

 error: incomplete type 'something' named in nested name specifier 

来自铿锵。 通过在头文件中写入完整的类,这将失去数据隐藏的全部意义,并且更改类中的私有变量将强制包含“something.h”的每个文件重新编译,我认为这里不需要。 我不需要使用“something.h”的文件来知道这个struct / class的大小,我通常只需要一个指针就可以了。 我怀疑它应该是这样的:

  class Something; Something::Something(); Something::~Something(); int Something::work_a(int x); 

通过这种方式,我可以写出我在C中所做的相同的事情,只是更短,甚至更清洁。 任何希望启发这个凡人C编码器的C ++编码器?

看看这篇文章: 用C ++隐藏实现细节 。 它应该让你指向你正在寻找的方向。 请注意,inheritance正用于实现目标。 还要理解,在C ++中,struct是一个所有成员都具有公共访问权限的类(包括函数,构造函数和析构函数)。 至少,接口必须被声明为一个类,然后在cpp文件(而不是另一个头文件)内的现在隐藏的类实现中公开inheritance。

在Pimpl设计模式中,查看这篇Stack Overflow文章: pimpl idiom vs. bridge design pattern 。 它也应该有所帮助。

实现这一目标的一种方法是通过Pimpl设计模式,您可以获得指向某个私有结构/类的指针,只有您的实现知道这些结构/类。 您的私有函数使用指针,理论上它可以主要内联。

使用新语句分配内存时,编译器必须知道要分配多少数据空间。 在使用new创建Something实例之前,编译器可以看到Something的数据大小。

在Something.h中使用类似的东西

 class Something { public: Something(); private: struct HiddenData; HiddenData* m_pHidden; }; 

在Something.cpp中使用类似的东西

 struct Something::HiddenData { int a; int b; 

};

 Something::Something() : m_pHidden(new HiddenData()) { m_pHidden->a = 1; }