草庐IT

c++ - Pimpl + QSharedPointer - 析构函数 = 灾难

昨天我遇到了痛苦,这让我沮丧了24小时。问题归结为随机发生的意外崩溃。使事情复杂化的是,调试报告也具有绝对随机模式。更复杂的是,所有调试跟踪都指向随机Qt源或nativeDLL,即每次都证明问题不在我这边。这里有一些这样可爱的报告的例子:ProgramreceivedsignalSIGSEGV,Segmentationfault.0x0000000077864324inntdll!RtlAppendStringToString()fromC:\Windows\system32\ntdll.dll(gdb)bt#00x0000000077864324inntdll!RtlAppendSt

c++ - 使用 PIMPL 习语时,有什么方法可以限制重复的样板文件吗?

我有如下内容://foo.h:classfoo{public:foo();~foo();//note:theparamtyperepetitionhereisonlyincidental,assumethe//functionscan'teasilybemadetosharetypesignaturesvoidbar(ab,cd);voidbaz(ab,cd,ef,gh,ij);voidquux(ab,cd,ef,gh,ij);private:classimpl;impl*m_pimpl;}然后://foo.cpp:classfoo::impl{public:voidbar(ab,cd

c++ - pimpl 习语如何减少依赖性?

考虑以下几点:PImpl.hppclassImpl;classPImpl{Impl*pimpl;PImpl():pimpl(newImpl){}~PImpl(){deletepimpl;}voidDoSomething();};PImpl.cpp#include"PImpl.hpp"#include"Impl.hpp"voidPImpl::DoSomething(){pimpl->DoSomething();}实现.hppclassImpl{intdata;public:voidDoSomething(){}}客户端.cpp#include"Pimpl.hpp"intmain(){PI

c++ - 关于RAII、STL pop、PIMPL的基本问题

今天阅读proggit时,我在post中看到了这条评论关于C++如何在GoogleAi挑战赛中名列前茅。用户reventlov声明ThebiggestproblemIhavewithC++isthatit'swaaaytooeasytothinkthatyou'rea"C++programmer"withoutreallyunderstandingallthethingsyouneedtounderstandtouseC++acceptablywell.You'vegottoknowRAII,andknowtousenamespaces,andunderstandproperexcep

c++ - 自动化 C++ 类的 pimpl'ing——有简单的方法吗?

Pimpl是许多C++代码中样板的来源。它们似乎是宏、模板和一些外部工具的组合可以帮助解决的问题,但我不确定最简单的方法是什么。I'veseentemplates这有助于完成一些提升,但作用不大——您最终仍然需要为您尝试包装的类的每个方法编写转发函数。有没有更简单的方法?我正在想象一个工具用作制作过程的一部分。你希望你的公共(public)头文件是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,它列出了你想要包装的类(实现的非pimpl'd),然后检查该文件,生成pimpl类,并且在“makeinstall”期间仅安装它们的header(不是原始类的header)。问题

PHP 依赖注入(inject) - Pimple 等。 - 为什么使用关联数组与 getter?

我们正在考虑将依赖注入(inject)容器集成到我们的项目中。我看过的每个DIC都使用关联数组和/或魔法方法。例如,这是来自Pimple页面的示例:$container['session_storage']=function($c){returnnew$c['session_storage_class']($c['cookie_name']);};$container['session']=function($c){returnnewSession($c['session_storage']);};这是有原因的吗?我讨厌在我的代码中将字符串作为将要显示在某处的文字字符串以外的任何内容。

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

我来自C#背景,最近开始学习C++。我遇到的一件事是pimpl成语。我为一些大公司做过C#开发,但从未遇到过。也许这是错误的,但我的理解是在C++中这是必要的,因为使用了头文件并且没有部分类选项。但是在C#中,我们总是会使用类库来构建应用程序。如果库代码发生变化,我们会将其重新编译为dll并在应用程序项目中引用新的dll。我真的不明白为什么不能用C++完成同样的事情。Pimpl对我来说只是一个丑陋的黑客。 最佳答案 Isthepimplidiomusedinc#?这取决于你所说的这个成语是什么意思。所讨论的习惯用法本质上是将一个类型

c++ - std::auto_ptr 或 boost::shared_ptr 用于 pImpl 成语?

使用pImplidiom时是否最好使用boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过boost版本对异常更友好?classFoo{public:Foo();private:structimpl;std::auto_ptrimpl_;};classFoo{public:Foo();private:structimpl;boost::shared_ptrimpl_;};[编辑]使用std::auto_ptr是否总是安全的,或者是否存在需要替代boost智能指针的情况? 最佳答案 您不应该为此使用std

c++ - 将 const std::unique_ptr 用于 pimpl 习惯用法

在HerbSutter'stalkatCppCon16他建议用conststd::unique_ptr编写pimplidiom(大约10分钟)。这应该如何与移动构造函数/赋值一起使用?c++17中有什么东西吗?我找不到任何东西。 最佳答案 如果您的类应该是永不为空的,那么非常量的唯一ptr(具有默认移动/分配)是不合适的。movector和moveassign都会清空rhs。一个constuniqueptr将禁用这些自动方法,如果你想移动,你必须在impl中编写它(并在外面有点胶水)。我会亲自编写一个具有我想要的语义的值ptr(然后

c++ - dll 中的 std::unique_ptr pimpl 使用 Visual Studio 生成 C4251

这不是一个重大问题,但我喜欢从警告中清除我的代码,所以这让我很紧张。我一直在使用c++11版本的pimplidiom以通常的方式隐藏我的库的类实现。//dllheaderclassFrameworkImpl;classEXPORT_APIFramework{Framework(constFramework&)=delete;Framework&operator=(constFramework&)=delete;Framework(Framework&&)=delete;Framework&operator=(Framework&&)=delete;public:Framework();