问题标签 [pimpl-idiom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 粉刺不工作
这是一个非常愚蠢的错误,但我不知道这里发生了什么。
有很多 pimpl 示例,但我不明白为什么这不起作用(这或多或少是示例之一,但我看不出区别)。
我有一个非常简单的 Pimpl 示例,但它不起作用。
和
编译这个给了我错误。C2100:非法间接。
谢谢。
c++ - C++:自动减少编译时依赖的工具
在阅读了 pimpl 成语后,我吓坏了!
那里没有可以检查 .h/.cpp 文件并推断可以放弃哪些依赖项的工具吗?
c++ - C++:创建共享对象而不是指向对象的共享指针
boost::shared_ptr 真的让我很困扰。当然,我了解这种东西的实用性,但我希望我可以shared_ptr<A>
将A*
. 考虑以下代码
创建 HelpfulContainer 的人并没有考虑其他人想要保留指向 A 对象的指针。我们不能给 HelpfulClass boost::shared_ptr 对象。但是我们可以做的一件事是使用 pimlp 习惯用法来创建一个 SharedA,它本身就是一个 A:
然后 main 函数看起来像这样:
所以,我的问题是:上面的模式是一个好的模式,还是我还没有考虑到什么。我当前的项目继承了一个HelpfulContainer
像上面这样删除我需要的指针的类,但我仍然需要 HelpfulContainer 中存在的数据结构。
更新:这个问题是一个后续问题。
c++ - C++:创建模板共享对象而不是 shared_ptr目的
根据我之前的问题,我希望 aboost::shared_ptr<A>
实际上是A
(或可能A*
)的子类,以便它可以用于A*
作为参数的方法中。
考虑以下类:
在上一个问题中,我建议创建一个 SharedA 对象来处理这个问题,并且大概确实如此。
如果我可以创建一个模板类来为我处理所有这些,那将是 Grrrrrrrreat 的想法。
如果我有这个(以及正确的构造函数Shared<T>
),那么我可以执行以下操作:
问题:
这有用吗?还是仅在您处理特别糟糕的代码的极端情况下才实用。例如:
void aFunctionYouHaveToUse(A* a) { /一些有用的算法然后/
删除 a; }是否可以构建这样的模板类?(我想你需要反思,对吧?)如果你能建造它,怎么建造?
c++ - 将所有方法放在类定义中
当我使用 pimpl 习惯用法时,将所有方法定义放在类定义中是个好主意吗?例如:
据我所知,将方法定义放在类定义中的唯一问题是(1)实现在包含类定义的文件中可见,以及(2)编译器可能使方法内联。
在这种情况下,这些都不是问题,因为类是在私有文件中定义的,并且内联没有效果,因为方法只在一个地方被调用。
将定义放在类中的好处是您不必重复方法签名。
那么,这样可以吗?还有其他需要注意的问题吗?
c++ - 在具有模板构造函数的类中使用智能指针的 Pimpl:奇怪的不完整类型问题
当使用带有 pImpl 习惯用法的智能指针时,如
明显的问题是在析构函数的生成Foo::Impl
点是不完整的。Foo
编译器通常会在那里发出警告,并且boost::checked_delete
Boost 智能指针在内部使用它,静态断言该类Foo::Impl
是完整的,如果不是这种情况则触发错误。
为了编译上面的示例,因此必须编写
Foo::~Foo
并在实现文件中实现一个空,这里Foo::Impl
是完整的。这是智能指针相对于裸指针的优势,因为我们不能不实现析构函数。
到目前为止,一切都很好。但是当我尝试在类似的Bar
类中引入模板构造函数时遇到了一个奇怪的行为(完整代码,请自行尝试):
使用 Visual Studio 2005 SP1 编译此示例时,出现以下错误Bar
但未出现错误Foo
:
我一回到家就用最近的 gcc 试试这个。
我不明白发生了什么:在定义析构函数的地方(即 in Bar.cpp
),定义 ofBar::Impl
是可用的,所以应该没有任何问题。为什么这适用于Foo
而不适用于Bar
?
我在这里想念什么?
c++ - 不使用动态内存分配的 Pimpl 习惯用法
我们想在项目的某些部分使用 pimpl idiom。项目的这些部分也恰好是禁止动态内存分配的部分,这个决定不在我们的控制范围内。
所以我要问的是,有没有一种干净而好的方法来实现 pimpl idiom 而无需动态内存分配?
编辑
这里有一些其他限制:嵌入式平台,标准 C++98,没有外部库,没有模板。
qt - pimpl idiom struct 内存泄漏
我们在课堂上使用 pimpl 成语。pimpl 结构在包含 pimpl 指针的类中声明,如下所示:
pimpl 的实现在一个名为 MyClassImpl.cpp 的单独文件中,例如:
在包含 pimpl 指针的类的构造函数中,我将在成员变量初始化列表中具有类似
现在,我们在源代码中启用了内存泄漏检测,如下所示:
我发现当程序退出时,MyClassImpl() struct m_Impl(new MyClassImpl()) 会报告内存泄漏:
我不明白为什么因为 m_Impl 是 boost::scoped_ptr 并且 QString、QVariant 和 shared_ptr 都是托管的。有任何想法吗?
c++ - 取决于模板参数的内部类
考虑下一个例子:
使用 g++ 编译时(版本 4.3.0)
编译错误是:
我真正想要归档的是根据枚举值具有不同的 Imp 实现(在示例中,我使用 int 而不是枚举,但这应该没关系)。
有人可以解释为什么不允许这样做吗?为什么我会收到第一个错误?(这个:限定名没有在'{'标记之前命名一个类)
关于取决于模板参数的 pimpl 实现,我在这里创建了一个新问题(有更好的例子)