防止库内部的东西在.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"使用成语?
相关文章:
- 将函数类成员映射到类本身内部
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- 方法内部但循环仍得到预期的不合格id错误C++
- C++:具有内部链接的正向声明常量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- libcurl 和 DNS ttl 中的内部连接管理
- 如何修改 lambda 内部字符串的向量
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 类内部和外部静态 constexpr 元组之间的差异