问题标签 [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.

0 投票
2 回答
555 浏览

c++ - C ++如何使二维引擎平台独立

使用跨平台抽象 API 创建一个简单的 2D sprite 引擎 ■ 演示应该是完全跨平台的,并且没有特定于平台的标头 ■ 跨平台代码与平台相关代码完全隔离,因为没有任何包含的痕迹任何平台无关文件中的平台特定标头。

我有这个任务,但我对如何跨平台制作东西感到非常困惑。我已经有一个能够做它必须做的事情的引擎,但我需要它是跨平台的。我主要想知道我可以包含哪些内容(或者,我如何知道某些内容是否使用特定于平台的代码),如果我不能包含某些内容,因为它们是特定于平台的,我不知道如何在没有包括它。根据一位同学的说法,解决方案存在于抽象和 Pimpl 中,但我找不到。

0 投票
0 回答
297 浏览

c++ - 发现编译时瓶颈以便有效地编译防火墙

我有这个需要很长时间才能构建的大型 C++ 增强项目,所以我正在尝试设置编译防火墙。现在我可以按照我的直觉撒粉刺或纯接口,但这似乎不是很有效......通常如果我想优化一段代码,我会通过分析器运行它以查看导致我以下的瓶颈问题:如何查看编译时间的瓶颈在哪里?

欢迎所有答案,包括尝试替代编译器,因为代码是跨平台的(交叉手指!)

谢谢,

0 投票
1 回答
591 浏览

c++ - c++ pimpl 和抽象类在一起

请看下面的代码(一个代码值一千字):

形状.hpp


形状.cc


我知道错误来自哪里,但我更关心良好做法。我的问题:

  1. 在上述代码的情况下,将 Pimpl 与 ABC 混合是一个坏主意吗?

  2. 如果没有,避免错误的最佳方法是什么(保持封装等)?

  3. 如果是,我必须做什么才能在向用户隐藏实现的同时获得多态性(在我的Shape场景中)?

Obs:假设性能不是问题。

谢谢你。

0 投票
3 回答
541 浏览

c++ - 编译 pimpl 成语代码的问题

我一直在尝试使用“pimpl”习语,但我就是无法编译该死的东西。

在带有 g++ v. 4.6.3 的 Linux Mint 上,我收到以下错误:

这是我的代码:

人.hh

个人.cc

主文件

除了代码错误之外,您能否就我模仿“pimpl”习语所采取的方法提出建议?这符合吗?

0 投票
2 回答
744 浏览

c++ - 在调试器中查看来自 DLL 的 pimpl

我正在使用 pimpl 习惯用法来隐藏接口的实现细节,这样我就可以对 ABI 进行一定程度的保护。我对 MS 的来龙去脉不是很精通……在我的大部分开发生涯中都使用 Linux。

我无法从调试器检查窗口查看 pimpl 的内部。我的类型仅扩展为指向 impl 的原始指针(它使用智能指针)。我试过导出符号,但这似乎不起作用。我想我实际上试图查看的符号没有被导入或其他东西。

我该如何补救?可视化器可以调用函数吗?

编辑——也许我把人们和出口的事情搞混了。

我正在尝试这个:

对象.h:

对象.cpp

我能想到解决问题的唯一方法是将 impl 放在库的调试版本中包含的标头中。希望有更好的解决方案。

0 投票
2 回答
227 浏览

c++ - C++ const 正确性漏洞或意外使用?

我遗漏了一些东西,或者 const-correctness 与指针(或者可能是智能指针,因为这是我测试过的?)的预期效果不太一样。无论如何,这是我在尝试 PIMPL 习语的变体时观察到的。

我声明了以下内容:

对于实施,我有类似的东西:

我难以理解的是如何摆脱const对函数使用限定符A::update_stuff(...)以及A::update_stuff_impl(...)何时实际修改A::pimpl::some_data??!或者这是预期的行为还是只是简单的错误使用?如果是后者之一,如果您能确定如何纠正它,请欣赏?

感谢您的时间和兴趣。

0 投票
1 回答
201 浏览

c++ - pimpl 习惯用法和构建器模式之间的重叠?

我正在阅读来自http://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Creational_Patterns链接的构建器模式,下面的代码似乎使用类似于 pimpl idiom 的想法,有一个指向 PizzaBuilder 的指针在 Class Cook 中作为私人成员。皮条客惯用语及其在设计师模式中的使用方式之间是否有任何重叠?

0 投票
1 回答
205 浏览

c++ - Hide implementation details via internal pointer

I have following third-party class(just wrapper around some pointer):

I want to modify A's interface: disable some methods, add some new, while hiding its implementation details. I decided to do following:

Is it ok to do so? Maybe there is better solution? I want to change A interface because it doesn't fit my needs and don't want to keep it in my own code.

0 投票
1 回答
164 浏览

c++11 - 带有 pimpl 的类可以使用带有 pimpl 的对象吗?

Pimpl是“实现指针”的缩写,它提供了一种方便的方法来隐藏类中的实现。我正在实现一个 Window 类,它对此类的用户隐藏特定于平台的功能和结构,因此类接口最终看起来很干净:

幕后都是那些讨厌的 WINAPI 调用等,当我可能针对更广泛的支持平台时,类头根本不需要更改,只需要更改源文件。非常好用,不用写那么多!

但是,这个对象似乎是我的问题(在类内):

这是一个 Direct3D/OpenGL 图形上下文(“ContextGraphics”的用户可以确定),您可能已经猜到,它也使用 pimpl-idiom:

我面临的问题是编译器:

Window.cpp|145|错误:无效使用不完整类型'class ContextGraphics::Helper'|

ContextGraphics.hpp|43|错误:'class ContextGraphics::Helper'的前向声明|

编译器似乎没有找到类“ContextGraphics::Helper”的实现,这只会引发一个问题,即带有 pimpl 的类是否可以使用带有 pimpl 的对象。如果不将所有实现都放在 Window 类源文件中,这可能吗?对我来说,这似乎不是一个合理的解决方案。

0 投票
3 回答
142 浏览

c++ - 通过 PIMPL 成语设计调用构造函数

现在使用 PIMPL 成语我正在尝试以这种方式调用 ProcessImpl 构造函数:

但我收到以下错误错误:在初始化中无法将 ProcessImpl 转换为 ProcessImpl*

请帮助解决此错误,并让我知道调用正确的方法