pimpl-idiom相关内容

在不使用未命名命名空间的情况下将 C++ 类隐藏在标头中

我正在编写一个 C++ 头文件,我在其中定义了一个 A 类 {//...}; 我想对外界隐藏(因为它可能会在此标头的未来版本中更改甚至被删除). 在同一个头文件中还有一个 B 类,它有一个 A 类的对象作为成员: B 类 {上市://...私人的:一个a_;}; 什么是对外界隐藏A级的正确方法? 如果我将 A 的定义放在未命名的命名空间中,编译器会发出警告,因此我假设由于内部链 ..
发布时间:2022-01-11 16:37:04 C/C++开发

PIMPL 成语真的在实践中使用吗?

我正在阅读 Herb Sutter 的 “Exceptional C++" 一书,在这本书中我了解了 PIMPL 习语.基本上,这个想法是为 class 的 private 对象创建一个结构,并动态分配它们以减少编译时间(并隐藏以更好的方式私有实现). 例如: class X{私人的:Cc;Dd;}; 可以改为: class X{私人的:结构 XImpl;XImpl* pImpl;}; ..
发布时间:2021-12-11 23:38:02 C/C++开发

如何使用 Qt 的 PIMPL 成语?

PIMPL 代表 Pointer 到 IMPLmentation.实现代表“实现细节":类的用户不需要关心的东西. Qt 自己的类实现通过使用 PIMPL 习语将接口与实现清晰地分开.然而,Qt 提供的机制没有记录.如何使用它们? 我希望这是 Qt 中关于“我如何 PIMPL"的规范问题.答案是由一个简单的坐标输入对话框界面激发的,如下所示. 当我们有一个半复杂的实现时,使用 P ..
发布时间:2021-12-09 16:14:58 C/C++开发

为什么要“PIMPL"习惯用法?

背景: PIMPL Idiom(指向实现的指针)是一种实现隐藏的技术,其中公共类包装了在公共类所属的库之外无法看到的结构或类. 这对库的用户隐藏了内部实现细节和数据. 在实现这个习惯用法时,为什么要将公共方法放在 pimpl 类而不是公共类上,因为公共类方法的实现会被编译到库中,而用户只有头文件? 为了举例说明,这段代码将 Purr() 实现放在 impl 类上并对其进行了 ..
发布时间:2021-12-01 15:35:19 C/C++开发

Pimpl 习惯用法与纯虚拟类接口

我想知道是什么让程序员选择 Pimpl 惯用语或纯虚拟类和继承. 我知道 pimpl 惯用语为每个公共方法和对象创建开销带来了一个明确的额外间接. 另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销. 编辑:但是如果您从外部创建对象,则需要一个工厂 是什么让纯虚拟类不如 pimpl 习惯用法? 解决方案 写C++类的时候,要考虑好要不要 ..
发布时间:2021-11-26 16:48:07 C/C++开发

Pimpl 习惯用法与纯虚拟类接口

我想知道是什么让程序员选择 Pimpl 惯用语或纯虚拟类和继承. 我知道 pimpl 惯用语为每个公共方法和对象创建开销带来了一个明确的额外间接. 另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销. 编辑:但是如果您从外部创建对象,则需要一个工厂 是什么让纯虚拟类不如 pimpl 习惯用法? 解决方案 写C++类的时候,要考虑好要不要 ..
发布时间:2021-11-25 09:22:09 C/C++开发

实现pimpl习惯用法时出现链接器错误

对提供者进行了编辑,使其更加清晰.道歉,使所有人感到困惑. 这是在Windows下. 我有一个静态库,该库使用pimpl习惯用法实现了一个类.pimpl头不仅被使用的代码使用,而且还链接到静态库.但是,当我编译使用代码(.exe)时,链接器会抱怨pimpl标头应该隐藏的实现类上无法解析的外部变量. 这怎么可能? //Foo.lib//Foo.h类FooImpl;Foo类{std : ..
发布时间:2021-05-29 21:28:50 C/C++开发

惯用语和可测性

c ++中的pImpl习惯用法旨在向该类的用户隐藏该类的实现详细信息(=私有成员).但是,它也隐藏了该类的某些依赖关系,这些依赖关系从测试的角度通常被认为是不好的. 例如,如果类A将其实现细节隐藏在只能从A.cpp访问的类AImpl中,并且AImpl依赖于许多其他类,则对单元A进行单元测试将变得非常困难,因为测试框架无法访问AImpl的方法,也没有办法将依赖项注入AImpl. 有人以前 ..
发布时间:2021-04-19 20:47:46 C/C++开发

具有模板成员功能的Pimpl Idiom

我想使用Pimpl Idiom,但是我遇到一个问题,成员函数之一是模板函数,因此必须在头文件中实现. 例如,下面的示例当然可以正常工作 //Foo.h class Foo{ struct Impl; Impl* ptr; public: Foo(); void bar(int); ~Foo(); }; //Foo.cpp struct Foo ..
发布时间:2020-07-03 19:01:19 C/C++开发

PIMPL习惯用语VS前向声明

我已经阅读了一些有关PIMPL习惯用法的内容,并且想知道-转发声明依赖类型有什么不同吗? 如果是这样: 什么时候我会更喜欢使用它而不是向前声明? 这两个版本的编译时间是否不同? 其中一个比另一个更具扩展性吗? 具体考虑依赖于Bar的类Foo(应该具有类型Bar的成员). Foo.h带有前向声明: class Bar; class Foo { public: ..
发布时间:2020-07-03 19:01:11 C/C++开发

为什么要二进制兼容?

我正在学习PIMPL习语.它的优点之一是二进制兼容性.我想知道二进制兼容性的优点是什么.谢谢! 解决方案 它避免了脆弱的二进制接口问题.它是这样的: 程序使用库. 用户升级库.升级会更改库的二进制接口中的某些内容. 程序直到重新编译后才起作用,因为它是基于旧的二进制接口构建的. PIMPL习惯用法的优点之一是,它使您可以将通常是类的公共接口一部分的内容移动到其私有接 ..
发布时间:2020-07-03 19:01:04 C/C++开发

D编程语言中的Pimpl习惯用法

D有一个很棒的模块系统,与C ++相比,它可以大大减少编译时间.根据文档,D仍然提供不透明的结构和联合以启用pimpl习惯用法.我的问题是:如何在一个模块中声明嵌套结构(或并集),然后在另一个模块中定义它?它的语法是什么? 在C ++中,标题看起来像这样 struct S { ... struct Impl; Impl * p; }; 和实现文件(c ..
发布时间:2020-07-03 19:01:00 其他开发

在调试器中从DLL查看pimpl

我正在使用pimpl惯用法来隐藏接口的实现细节,以便可以对ABI进行某种程度的保护.我不太了解MS的来龙去脉...在我的大部分开发生涯中都使用Linux. 我无法从调试器检查窗口查看pimpl的内部.我的类型仅扩展到impl的原始指针(它使用智能指针).我尝试导出符号,但这似乎不起作用.我想我实际上要查看的符号没有被导入或什么东西. 我该如何补救?可视化工具可以调用函数吗? 编辑 ..
发布时间:2020-07-03 19:00:56 C/C++开发

使用shared_ptr处理不完整类型的Pimpl习惯用法

我正在阅读Scott Meyers的《 Effective Modern C ++》,他正在讨论pimpl习惯用法,并使用unique_ptr指向实现类,但是存在一个特殊的成员函数(例如析构函数)要求该类型的问题完整.这是因为unique_ptr的默认删除程序会在使用delete p之前静态断言要删除的类型是否完整.因此,必须在实现文件中定义类的任何特殊成员函数(而不是由编译器生成),而在实现类定 ..
发布时间:2020-07-03 19:00:50 C/C++开发