问题标签 [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 回答
1028 浏览

c++ - 是否可以用 Pimpl 包装升压插座?

在一个项目中,我们希望以某种方式包装 Boost Asio 套接字,使用类或包装 .h 不必包含 boost 标头。

我们通常对包装类使用指针和前向声明。

转发声明:

然后声明套接字:

(如果你不知道 scoped_ptr,忽略它,问题等同于标准 * 指针。)

但这会产生编译器错误:

我理解这是因为 udp 实际上不是命名空间,而是一个类本身。我们只想使用内部类,有什么想法吗?

0 投票
3 回答
1851 浏览

c++ - PIMPL 问题:如何在没有代码重复的情况下为 impl 提供多个接口

我有这个 pimpl 设计,其中实现类是多态的,但接口应该只包含一个指针,使它们多态在某种程度上违背了设计的目的。

所以我创建了我的 Impl 和 Intf 基类来提供引用计数。然后用户可以创建他们的实现。一个例子:

这是哪里有问题。Polygon 类有两种可能的声明:

在Polygon1中,我重写了draw的代码,因为我没有继承它。在 Polygon2 中,我需要丑陋的动态转换,因为 GetImpl() 不知道 PolygonImpl。我想做的是这样的:

但是这里当然有问题。除非我从 Intf 派生它们,否则我无法从接口类访问 GetImpl()。如果我这样做,我需要让 Intf 出现在它出现的任何地方都是虚拟的。

或者我可以在每个接口中存储一个 TImpl*& 并使用对基本 Intf::impl 的引用来构造它们。但这只是意味着对于包含的每个接口,我都有一个指向我自己的指针。

这两种解决方案都使 Intf 类膨胀,添加了额外的取消引用,并且基本上没有比直接多态性提供任何好处。

所以,问题是,除了在各处复制代码(存在维护问题)之外,我是否错过了第三种方法来解决这个问题?

完全应该,但不起作用:我希望基类联合只是覆盖类布局,并且对于多态类,要求它们具有完全相同的 vtable 布局。然后 Intf 和 ShapeInterface 都将各自声明一个 T* 元素并以相同的方式访问它:

0 投票
3 回答
216 浏览

c++ - 奇怪的“type class::method(): stuff”语法C++

在阅读有关 pImpl 习语的一些东西时,我发现了这样的内容:

MyClass::MyClass() : pimpl_( new MyClassImp() )

第一:什么意思?
第二:语法是什么?
很抱歉成为这样的菜鸟。

0 投票
3 回答
622 浏览

c++ - 前向声明的类枚举问题的解决方法?

我正在维护一个大型代码库,并且正在使用前向声明和 pImpl 习惯用法的组合来缩短编译时间并减少依赖关系(它工作得非常好,)

我遇到的问题是包含公共枚举的类。这些枚举不能向前声明,所以我别无选择,只能包含类头。例如:

所以,我正在寻找避免这种情况的方法,只能想到以下几点:

将类枚举移动到单独的“类型”命名空间

使用 int 而不是枚举

我错过了什么?其他人如何绕过这个限制(不能转发声明枚举。)

0 投票
3 回答
1835 浏览

c++ - STL 友好的 pImpl 类?

我正在维护一个可能需要花费大量时间来构建的项目,因此我正在尝试尽可能减少依赖关系。pImpl如果习语和我想确保我正确执行此操作并且这些类将与 STL(尤其是容器)很好地配合使用,则某些类可以使用。这是我计划做的一个示例 - 这看起来好吗? 我正在使用std::auto_ptr实现指针 - 这可以接受吗?使用 aboost::shared_ptr会更好吗?

以下是使用名为and的SampleImpl类的类的一些代码:FooBar

0 投票
4 回答
397 浏览

c++ - Pimpl 习惯用法:如果实现未知,使用什么 size_type?

我有一个包含元素数组的类,我想给它一个GetSize成员函数。但是我应该给那个函数什么返回类型呢?

我正在使用 pimpl 习惯用法,因此在头文件中不知道实现将使用什么来存储元素。所以我不能只说std::vector<T>::size_type,例如:

0 投票
7 回答
2111 浏览

c++ - pimpl 类的私人成员?

pimpl 惯用语中使用的实现类是否有任何理由拥有任何私有成员?我真正能想到的唯一原因是保护自己免受自己的伤害——即私有成员用于执行类和用户之间的某种契约,在这种情况下,类和用户是密切相关的,所以它似乎没有必要。

0 投票
2 回答
505 浏览

c++ - 另一个命名空间中模板的不透明对象

我知道如何在 C++ 中做一个不透明的对象,如下所示:

现在,当不透明对象是不同命名空间中的现有类模板而不包括该类模板的头文件时,如何做到这一点。下面的代码不好,只是为了说明我的问题。

我的源代码的实际类比这个例子更加模板化(模板的 4 个参数,其中一些本身就是模板类)。

由于 my_class.hpp 在我的项目中无处不在,因此一般编译需要花费大量时间(只需 5 秒即可为每个 cpp 文件包含 my_class.hpp),因此我想避免包含 opaque_object.hpp、template_class.hpp ...在 my_class.hpp 中。

如何才能做到这一点 ?欢迎任何评论或想法。在此先感谢您的时间。

0 投票
2 回答
834 浏览

c++ - 如何使用 Loki 的 Pimpl 实现?

链接到 Loki Pimpl标头的源代码。我找不到任何关于如何使用它的文档,任何人都可以解释如何使用。标题中的以下函数有什么作用。

  1. 粉刺所有者
  2. 实施
  3. 粉刺
  4. RimplOf
0 投票
5 回答
3669 浏览

c++ - 如何返回通用迭代器(独立于特定容器)?

我想设计一个类Foo来存储不同类型的各种数据并返回迭代器。它应该是通用的,因此用户Foo不知道数据是如何存储的(Foo可能正在使用std::setstd::vector其他)。

我很想写一个这样的界面:

Iterator像这样的东西在哪里(比如.NET中的迭代器):

但我知道这种迭代器在 C++ 中不是标准的,最好像 STL 那样使用迭代器,这样你就可以在它们上使用 STL 算法。

我怎样才能做到这一点?(我需要iterator_traits任何机会吗?)