防止库内部的东西在.h中可见

Preventing library internal stuff from beeing visible in .h

本文关键字:内部      更新时间:2023-10-16

首先:我知道我的问题很可能是基于一个普遍的误解,但我希望我能把我的观点告诉你。

我知道当把代码放入不同的c++文件时,我们必须创建一个。h(用于定义)和一个。cpp(用于实现)。例如,在编写类库时,我必须在头文件中同时定义private和public成员。但是,如果出于某种原因,我想对用户隐藏私有内容,该怎么办呢?

谢谢!

您使用Pimpl习语。Pimpl代表"实现指针"。基本上,您不会在类中存储实现细节。相反,您可以像这样存储一个指向实现的不透明指针:

class MyClass
{
public: 
    //public functions here
private:
    class Impl; //no definition, opaque
    Impl* pimpl;
};

然后你继续只在。cpp文件中定义你的MyClass::Impl类,因为只有函数定义需要它。

PIMPL习语还有一个额外的好处,只要类的接口不改变,对实现所做的任何改变都不需要重新编译类客户端。

你不能。这是c++的缺点之一:标记为private的东西仍然是类声明的一部分,因此将出现在头文件中。

如果您真的想要隐藏功能,那么使用pImpl习惯用法可以提供帮助。就我个人而言,我更愿意接受这个缺点,因为使用这种习惯用法可能会导致其他问题,比如你的类不再是可复制的。

请参阅为什么应该"PIMPL"使用成语?