草庐IT

pimpl-idiom

全部标签

c++ - 将所有方法放在类定义中

当我使用pimpl习惯用法时,将所有方法定义放在类定义中是个好主意吗?例如://inA.hclassA{classimpl;boost::scoped_ptrpimpl;public:A();intfoo();}//inA.cppclassA::impl{//methoddefinedinclassintfoo(){return42;}//asopposedtoonlydeclaringthemethod,anddefiningelsewhere:floatbar();};A::A():pimpl(newimpl){}intA::foo(){returnpimpl->foo();}据我

c++ - Pimpl with unique_ptr : Why do I have to move definition of constructor of interface to ".cpp"?

只要我不将构造函数(B)的定义移动到标题B.h中,代码就可以工作。B.hclassImp;//imp;B();//B.cpp#include"B.h"#include"Imp.h"B::B(){}~B::B(){}Imp.hclassImp{};Main.cpp(编译我)#include"B.h"Error:deletionofpointertoincompletetypeError:useofundefinedtype'Imp'C2027我能以某种方式理解必须将析构函数移动到.cpp,因为可能会调用Imp的解构:-deletepointer-of-Imp;//somethinglik

Code Complete 关于封装的 C++ 建议?

CodeComplete中关于“良好封装”的部分,建议隐藏私有(private)实现细节。C++中给出了一个例子。这个想法基本上是将接口(interface)与实现完全分离,即使在类级别也是如此。classEmployee{public:...Employee(...);...FullNameGetName()const;StringGetAddress()const;private:EmployeeImplementation*m_implementation;};这样真的可以很好地利用时间吗?这不仅看起来效率低下(这会带来什么样的性能损失?),而且CodeComplete的整个座右

C++ 惯用法之 PIMPL

一、背景1.概述PIMPL是C++中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问。2.二进制兼容性(1)概述二进制兼容是指当库文件升级后所有使用该库的应用程序不必重新编译,其本质就是类的内存布局不变。使用pimpl方法设计类可以实现二进制兼容的目的。(2)类成员更改后的内存布局原始类定义:classdemoClass{private:inta;intb;};内存布局如下:类更改后的定义:classdemoClass{private:charc;inta;intb;};内存布局如下:(3)pimpl下类的内存布局classdemoClas

c++ - ‘operator=’ 的模糊重载与 c++11 std::move and copy and swap idiom

我收到以下错误:[matt~]g++-std=c++11main.cpp-DCOPY_AND_SWAP&&./a.outmain.cpp:Infunction‘intmain(int,constchar*const*)’:main.cpp:101:24:error:ambiguousoverloadfor‘operator=’in‘move=std::move((*©))’main.cpp:101:24:note:candidatesare:main.cpp:39:7:note:Test&Test::operator=(Test)main.cpp:52:7:note:Test&

c++ - "lightweight type categorization idiom"的最简单实现?

我的目标是实现一个检测嵌套using是否存在的谓词别名(或typedef)充当轻量级标签以指示类具有某些属性(用于泛型编程)。例如,has_my_tag谓词的行为应如下所示:structA{usingmy_tag=void;};structB{};intmain(){static_assert(has_my_tag::value,"");//evaluatetotrueifmy_tag=voidispresentstatic_assert(!has_my_tag::value,"");//falseotherwise}用户@JoelFalcou称其为“轻量级类型分类成语”并在thisa

C++ pimpl 习语浪费指令与 C 风格?

(是的,我知道一条机器指令通常并不重要。我问这个问题是因为我想了解pimpl惯用语,并以最好的方式使用它;而且因为有时我会这样做关心一条机器指令。)在下面的示例代码中,有两个类,Thing和其他。用户将包括“thing.hh”。Thing使用pimpl习语来隐藏它的实现。OtherThing使用C风格——返回和获取的非成员函数指针。这种风格产生稍微好一点的机器代码。我是想知道:有没有办法使用C++风格——即创建函数成成员函数——但仍然保存机器指令。我喜欢这种风格,因为它不会污染类外的命名空间。注意:我只关注调用成员函数(在本例中为calc)。我不是在看对象分配。以下是我Mac上的文件、

c++ - 模板中的 pimpl 成语;哪个智能指针?

我通常为pimpl使用boost::scoped_ptr(出于一个原因,因为如果我忘记处理复制构造函数,我不会感到惊讶)然而,对于模板,我不能只将析构函数放在完全定义了impl的cpp文件中,以满足scoped_ptr的析构函数的要求。无论如何它确实有效,但我不确定它是否保证有效或只是偶然。是否有一些“最佳实践”或标准?scoped_ptr是不可复制类中pimpls的最佳智能指针吗?templateclassC{public:C(){}~C(){}private:boost::scoped_ptrpimpl_;}; 最佳答案 碰巧H

c++ - 是否可以用 C++ 编写敏捷的 Pimpl?

我一直在玩弄Pimpl惯用法,并从中获益匪浅。唯一不太热衷的是定义函数时的感觉。一次在标题中(Pdef)一旦在.cpp的顶部(Impldef)一次在.cpp的中间(ImplImpl)一次在.cpp(PImpl)的低端我真的很喜欢减少代码差异和冗余,当我不得不在当前项目中添加或更改功能时,即使是相对复杂的Impls,我也觉得我的代码不够流畅。我的问题是,有什么有效的方法可以暗示或模板化我的类,如果我要定义一个新函数,我只需要编写一个明确的定义和实现,其余的都保留在空间上接近代码中的显式;如果我要改变一个功能,必要的改变会尽可能少吗? 最佳答案

c++ - 这是在 C++11 中使用 unique_ptr 和移动语义实现 pimpl 的正确方法吗

我还没有看到同时使用unique_ptr和移动语义的pimpl示例。我想向STL派生容器添加一个CHelper类,并使用pimpl隐藏CHelper的功能。这样看起来对吗?派生.hclassCDerived:publicset,publicCHelper{//...};`Helper.h//derivedcontainersneedtosupportbothcopyandmove,soCHelperdoestooclassCHelper{private:classimpl;unique_ptrpimpl;public://---default:needbothcotr&cotr(com