我有以下代码的错误incompletetype‘Foo::Pimpl’usedinnestednamespecifier另一个Foo.hppstructAnotherFoo{voidmethodAnotherFoo(Foo&);};另一个Foo.cpp#include"Foo.hpp"#include"AnotherFoo.hpp"voidAnotherFoo::methodAnotherFoo(Foo&foo){//hereiwanttosavethefunctionpointerofmethodPimpl(),std::functionforex:std::functionfn=s
我正在维护一个大型代码库,并结合使用前向声明和pImpl习惯用法来缩短编译时间并减少依赖性(而且效果非常好,)我遇到的问题是包含公共(public)枚举的类。这些枚举不能向前声明,所以我别无选择,只能包含类头。例如://Foo.hclassFoo{public:enumType{TYPE_A,TYPE_B,};...};//Bar.h#include"Foo.h"//ForFoo::TypeclassBar{public:voidsomeFunction(Foo::Typetype);...};所以,我正在寻找避免这种情况的方法,只能想到以下几点:将类枚举移动到单独的“类型”命名空间/
通常的克隆习语使用协变返回类型:structBase{virtualBase*clone();};structDerived:publicBase{Derived*clone();};我读过一些东西,大意是协变返回类型是后来添加到C++中的,旧的编译器可能不支持它们。在这种情况下Derived类必须声明它的clone返回Base*的成员函数.因为,据推测,我只访问Derived通过Base的对象使用此习语时的指针和/或引用,声明返回类型的真正用途/好处是什么Derived*?还有一个相关的问题:我更愿意使用智能指针来表达clone的所有权转移语义。签名。这在使用协变返回类型时是不可能的
假设我正在编写一个静态库。让它有一个类Foo//mylib.h#includeclassFoo{//...private:type_from_dependent_libraryx;}如您所见,这个库(我们称它为mylib)依赖于另一个库。它编译得很好。但是当用户编译它的代码(使用Foo并包含mylib.h)并与我的库链接时,编译失败,因为用户需要有dependency_header_from_other_static_library.h头文件来编译代码。我想对用户隐藏这种依赖性。如何做到这一点?想到的一件事是PIMPL习语。喜欢://mylib.h#includeclassFoo{//
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion我当前的项目涉及编写C++API,我决定使用PIMPL惯用法。我是否应该在我的项目中到处使用PIMPL习语,例如我需要创建一个继承自std::exception的自定义类,我应该在设计此类时考虑PIMPL习语还是可以我只是作为一个公共(public)实现来编写?仅仅因为我使用的是PIMPL习语就认为我创建的每个类都应该围绕它来设计,这感觉是错误的。PIMPL是否应该不被使用?
从STL中的集合中删除项目需要一种经常使用的技术,该技术已成为一种习语:theerase-remove-idiom这个习语最常见的用法之一是删除T类型的项目来自vectorstd::vectorwidget_collection;Widgetwidget;widget_collection.erase(std::remove(widget_collection.begin(),widget_collection.end(),widget),widget_collection.end());这显然非常冗长,并且违反了DRYprinciple-有问题的vector在那里需要4次。所以我的问
据我了解,pimpl习惯用法的主要好处是将数据成员隐藏在实现文件而不是header中。但是,需要在header中完整定义模板,以便编译器按需实例化它们。在这种情况下,对模板类使用pimpl习惯用法有什么好处吗? 最佳答案 虽然在模板类中使用pimpl习惯用法并没有真正隐藏任何内容,但它确实允许您轻松编写非抛出交换(尽管使用C++11移动语义这不是一个问题)。 关于c++-使用模板化类的pimpl习语有什么优势吗?,我们在StackOverflow上找到一个类似的问题:
我正在使用pimpl惯用法实现几个类,并且遇到了一些设计问题。首先,我一直看到pimpl是这样做的classObject{public:Visible();~Visible();..etc..private:classObjectImpl*_pimpl;};我有几个使用这种方法的类,我的问题是其中几个类需要访问彼此的实现细节,但_pimpl指针是私有(private)的。谁能看到将_pimpl公开的缺点。显然,如果它是公开的,那么有人可能会不小心(或故意)重新分配它。(我忽略了一个事实,即“私有(private)”可以#defined为“公共(public)”并授予访问权限。如果您这样
我正在编写一个C++头文件,我在其中定义了一个classA{//...};我想对外界隐藏(因为它可能会改变,甚至会在这个标题的future版本中被删除)。在同一个标头中还有一个类B,它有一个类A的对象作为成员:classB{public://...private:Aa_;};什么是对外界隐藏A类的正确方法?如果我将A的定义放在未命名的命名空间中,编译器会发出警告,因此我认为,由于内部链接的问题,我应该做其他事情。 最佳答案 在C++中正确的做法是PIMPL成语。替代解决方案是将要隐藏的类放入嵌套命名空间,通常称为detail。但
传统的PImplIdiom是这样的:#includestructBlah{//publicinterfacedeclarationsprivate:structImpl;std::unique_ptrimpl;};//insourceimplementationfile:structBlah::Impl{//privatedata};//publicinterfacedefinitions然而,forfun,Itried改为使用具有私有(private)继承的组合:[测试.h]#include#includetemplatestructPImplMagic{PImplMagic(){s