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

c++ - 在 pimpl 类中初始化默认值的最佳位置?

我对 PImpl 进行了相当广泛的使用,而我发现自己正在纠结的事情是在哪里初始化 Pimpl 结构的成员。选项是为Private结构创建一个构造函数并在那里初始化它们,或者在主类的构造函数中初始化它们。

myclass.hpp:

我的类.cpp:

目前我并没有真正看到两者之间的区别,除非我出于某种原因想要创建新Private对象或复制它们或其他东西,那么选项 A 可能更可取。它还能够初始化初始化列表中的变量,这是值得的。但是,我发现选项 B 往往更具可读性,也许也更易于维护。这里有什么我看不到的东西可能会以一种或另一种方式倾斜天平吗?

0 投票
1 回答
406 浏览

c++ - 模板化 pimpl 转发

我在一种模板层次结构中有一堆相关的指标,看起来像

以及一个应该生成和缓存由它们索引的对象的类。我想对这个类使用 pimpl,我想知道是否有一种方法可以使用模板将函数调用转发到实现类。就像是

0 投票
3 回答
2672 浏览

c# - c#中使用了pimpl成语吗?

我来自 C# 背景,最近开始学习 C++。我遇到的一件事是 pimpl 成语。我为一些大公司做过 C# 开发,但从未遇到过。

也许这是错误的,但我的理解是在 C++ 中这是必要的,因为使用了头文件并且没有部分类选项。

但是在 C# 中,我们总是会使用类库来构建应用程序。如果库代码发生变化,我们会将其重新编译为 dll 并在应用程序项目中引用新的 dll。

我真的不明白为什么不能用 C++ 做同样的事情。Pimpl 对我来说只是一个丑陋的黑客。

0 投票
2 回答
1971 浏览

c++ - C++ Pimpl vs 纯虚拟接口性能

我意识到有很多关于这个主题的帖子,但我很难找到这个确切问题的答案。

对于函数调用,哪个更快,是纯虚拟接口还是 pimpl?

乍一看,在我看来纯虚拟接口会更快,因为使用 pimpl 会花费两个函数调用而不是一个......或者在这种情况下会采用某种聪明的编译器技巧吗?

编辑:我正在尝试决定我应该使用其中的哪一个来抽象出一些对象的系统相关部分,这些对象可能最终不得不非常频繁地大量生成。

编辑:
我想在这一点上值得一说,我的问题的根源是我误认为抽象工厂设计模式是一种使我的代码在多个平台上工作的方法,而它的真正目的是切换给定接口的实现在运行时。

0 投票
1 回答
145 浏览

c++ - 当试图优化/内联我看起来平凡但不平凡的 dtor 时,编译器会自责,我做错了什么?

我有这个共享的 pimpl*。它向前声明了实现对象,并有一个自定义实现的共享指针对象来实现 pimpl 习惯用法(同样,具有共享语义)。浓缩,它看起来像这样:

Foo.h

Foo.cpp

现在,(我认为)编译器在编译Bar.cpp(使用Foo对象和其他 SharedPtr对象)时变得非常聪明并抱怨:

除了and~SharedPtr<Foo_impl>之外,还有谁可能在打电话?这是从哪里来的,我该如何解决?FooFooFactory

注意:制作~Foo虚拟并没有帮助,这对我来说更令人费解。


* impl 被共享的事实在这里无关紧要,我只是想阻止典型的“请定义一个复制-ctor/分配方法”的评论。共享 pimpl 指针是完全有意的。


编辑:SharedPtr界面:

0 投票
2 回答
1892 浏览

c++ - 在未命名的命名空间中声明变量

在我目前的工作中,我看到在 cpp 文件中的未命名命名空间中声明的变量,并且仅由该类使用,就好像它们是成员变量一样。

我认为这是一种在 .h 中仅保留接口信息并在 .cpp 中实现的有趣方式,并且比通常的 pimpl 惯用语工作量少。

我看到人们一直在使用 pimpl 但从来没有这种方法,它有什么问题吗?

0 投票
1 回答
1042 浏览

qt - QImage 写入时复制

QImage基于QSharedDataQimage跟随pimplor copy on write? _ 例如,复制(通过复制或分配)Qimage 会制作像素的深层复制吗?

0 投票
1 回答
600 浏览

.net - 如何使用 PIMPL 从 C++/CLI 使用 C# 类

我需要使用非托管应用程序中的 C# 类。假设我有以下 C# 类:

然后我创建以下 C++/CLI 类:

这样做时,我得到一个指向不完整类类型的指针是不允许的,所以我没有得到任何东西。我不是一个天生的非托管开发人员,所以如果问题有点愚蠢,请原谅我:\

0 投票
1 回答
3281 浏览

java - Java编程成语:私有实现类

我在一些代码中发现了这个结构。

私有静态类实现 A 有什么好处吗?这让我想起了 C++ 中的 Pimpl 成语。在 Java 中使用 Pimpl 习语有什么好处吗?

0 投票
2 回答
5922 浏览

c++ - 什么构成 C++11 中“移出”对象的有效状态?

我一直在努力思考 C++11 中的移动语义应该如何工作,并且在理解移动对象需要满足哪些条件时遇到了很多麻烦。在这里查看答案并不能真正解决我的问题,因为尽管移动语义的论点非常适合 pimpls,但看不到如何以合理的方式将其应用于 pimpl 对象。

我的问题的最简单说明涉及 pimpl 成语,如下所示:

现在,一旦我从Foo. 我可以安全地销毁被移动的对象,我可以分配给它,这两者都是绝对关键的。但是,如果我尝试do_stuff使用我的Foo,它会爆炸。在我为我的定义添加移动语义之前Foo,每个都Foo满足它可以的不变量,现在do_stuff情况不再如此。似乎也没有很多很好的选择,因为(例如)放置移动源Foo将涉及新的动态分配,这部分违背了移动语义的目的。我可以检查是否impl_进入do_stuff并将其初始化为默认值FooImpl如果是这样,但这会增加一个(通常是虚假的)检查,如果我有很多方法,那就意味着要记住对每个方法都进行检查。

我应该放弃能够do_stuff是一个合理的不变量的想法吗?