pimpl-idiom相关内容
..
我正在编写一个 C++ 头文件,我在其中定义了一个 A 类 {//...}; 我想对外界隐藏(因为它可能会在此标头的未来版本中更改甚至被删除). 在同一个头文件中还有一个 B 类,它有一个 A 类的对象作为成员: B 类 {上市://...私人的:一个a_;}; 什么是对外界隐藏A级的正确方法? 如果我将 A 的定义放在未命名的命名空间中,编译器会发出警告,因此我假设由于内部链
..
我正在阅读 Herb Sutter 的 “Exceptional C++" 一书,在这本书中我了解了 PIMPL 习语.基本上,这个想法是为 class 的 private 对象创建一个结构,并动态分配它们以减少编译时间(并隐藏以更好的方式私有实现). 例如: class X{私人的:Cc;Dd;}; 可以改为: class X{私人的:结构 XImpl;XImpl* pImpl;};
..
PIMPL 代表 Pointer 到 IMPLmentation.实现代表“实现细节":类的用户不需要关心的东西. Qt 自己的类实现通过使用 PIMPL 习语将接口与实现清晰地分开.然而,Qt 提供的机制没有记录.如何使用它们? 我希望这是 Qt 中关于“我如何 PIMPL"的规范问题.答案是由一个简单的坐标输入对话框界面激发的,如下所示. 当我们有一个半复杂的实现时,使用 P
..
背景: PIMPL Idiom(指向实现的指针)是一种实现隐藏的技术,其中公共类包装了在公共类所属的库之外无法看到的结构或类. 这对库的用户隐藏了内部实现细节和数据. 在实现这个习惯用法时,为什么要将公共方法放在 pimpl 类而不是公共类上,因为公共类方法的实现会被编译到库中,而用户只有头文件? 为了举例说明,这段代码将 Purr() 实现放在 impl 类上并对其进行了
..
我想知道是什么让程序员选择 Pimpl 惯用语或纯虚拟类和继承. 我知道 pimpl 惯用语为每个公共方法和对象创建开销带来了一个明确的额外间接. 另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销. 编辑:但是如果您从外部创建对象,则需要一个工厂 是什么让纯虚拟类不如 pimpl 习惯用法? 解决方案 写C++类的时候,要考虑好要不要
..
我想知道是什么让程序员选择 Pimpl 惯用语或纯虚拟类和继承. 我知道 pimpl 惯用语为每个公共方法和对象创建开销带来了一个明确的额外间接. 另一方面,纯虚拟类带有用于继承实现的隐式间接(vtable),我知道没有对象创建开销. 编辑:但是如果您从外部创建对象,则需要一个工厂 是什么让纯虚拟类不如 pimpl 习惯用法? 解决方案 写C++类的时候,要考虑好要不要
..
对提供者进行了编辑,使其更加清晰.道歉,使所有人感到困惑. 这是在Windows下. 我有一个静态库,该库使用pimpl习惯用法实现了一个类.pimpl头不仅被使用的代码使用,而且还链接到静态库.但是,当我编译使用代码(.exe)时,链接器会抱怨pimpl标头应该隐藏的实现类上无法解析的外部变量. 这怎么可能? //Foo.lib//Foo.h类FooImpl;Foo类{std :
..
c ++中的pImpl习惯用法旨在向该类的用户隐藏该类的实现详细信息(=私有成员).但是,它也隐藏了该类的某些依赖关系,这些依赖关系从测试的角度通常被认为是不好的. 例如,如果类A将其实现细节隐藏在只能从A.cpp访问的类AImpl中,并且AImpl依赖于许多其他类,则对单元A进行单元测试将变得非常困难,因为测试框架无法访问AImpl的方法,也没有办法将依赖项注入AImpl. 有人以前
..
考虑一下,我正在编写一个静态库。使其具有类 Foo // mylib.h #include class Foo { // ... private: type_from_dependent_library x; } 您可以看到此库(将其命名为 mylib )
..
当我显式实例化模板时,如何将pimpl用于模板化类? 我只需要一个示例代码. 我尝试过的是: // MyTemplatedClass.h template class MyTemplatedClass { private: class Impl; Impl* _pimpl; public: void PublicMethod();
..
我想使用Pimpl Idiom,但是我遇到一个问题,成员函数之一是模板函数,因此必须在头文件中实现. 例如,下面的示例当然可以正常工作 //Foo.h class Foo{ struct Impl; Impl* ptr; public: Foo(); void bar(int); ~Foo(); }; //Foo.cpp struct Foo
..
根据我以前的问题,我希望boost::shared_ptr实际上是A(或者也许是A*)的子类,以便可以在将A*作为其参数的方法中使用. 请考虑以下课程: class A { public: A(int x) {mX = x;} virtual void setX(int x) {mX = x;} virtual int getX() const {retu
..
我已经阅读了一些有关PIMPL习惯用法的内容,并且想知道-转发声明依赖类型有什么不同吗? 如果是这样: 什么时候我会更喜欢使用它而不是向前声明? 这两个版本的编译时间是否不同? 其中一个比另一个更具扩展性吗? 具体考虑依赖于Bar的类Foo(应该具有类型Bar的成员). Foo.h带有前向声明: class Bar; class Foo { public:
..
是否有可能实现以下目标: x.hpp -其他许多类都包含此文件 class x_impl; //forward declare class x { public: //methods... private: x_impl* impl_; }; x.cpp -实现 #include typedef conc
..
我想借助Q_D宏在派生类中使用d指针. 这是我的父母班: class DIGIKAM_EXPORT GraphicsDImgView : public QGraphicsView { Q_OBJECT public: class GraphicsDImgViewPrivate; protected: GraphicsDImgViewPrivate* cons
..
我正在学习PIMPL习语.它的优点之一是二进制兼容性.我想知道二进制兼容性的优点是什么.谢谢! 解决方案 它避免了脆弱的二进制接口问题.它是这样的: 程序使用库. 用户升级库.升级会更改库的二进制接口中的某些内容. 程序直到重新编译后才起作用,因为它是基于旧的二进制接口构建的. PIMPL习惯用法的优点之一是,它使您可以将通常是类的公共接口一部分的内容移动到其私有接
..
D有一个很棒的模块系统,与C ++相比,它可以大大减少编译时间.根据文档,D仍然提供不透明的结构和联合以启用pimpl习惯用法.我的问题是:如何在一个模块中声明嵌套结构(或并集),然后在另一个模块中定义它?它的语法是什么? 在C ++中,标题看起来像这样 struct S { ... struct Impl; Impl * p; }; 和实现文件(c
..
我正在使用pimpl惯用法来隐藏接口的实现细节,以便可以对ABI进行某种程度的保护.我不太了解MS的来龙去脉...在我的大部分开发生涯中都使用Linux. 我无法从调试器检查窗口查看pimpl的内部.我的类型仅扩展到impl的原始指针(它使用智能指针).我尝试导出符号,但这似乎不起作用.我想我实际上要查看的符号没有被导入或什么东西. 我该如何补救?可视化工具可以调用函数吗? 编辑
..
我正在阅读Scott Meyers的《 Effective Modern C ++》,他正在讨论pimpl习惯用法,并使用unique_ptr指向实现类,但是存在一个特殊的成员函数(例如析构函数)要求该类型的问题完整.这是因为unique_ptr的默认删除程序会在使用delete p之前静态断言要删除的类型是否完整.因此,必须在实现文件中定义类的任何特殊成员函数(而不是由编译器生成),而在实现类定
..