这个问题在这里已经有了答案:std::unique_ptrwithanincompletetypewon'tcompile(7个答案)关闭8年前。让我们考虑以下示例(使用c++11)A.hpp:#includeclassA{public://A();//~A();private:structAImpl;std::unique_ptrpImpl;};主要.cpp:#include"A.hpp"intmain(){Aa;}使用默认构造函数和析构函数。不编译。发生以下错误:Infileincludedfrom/usr/include/c++/4.8/memory:81:0,fromA.hpp
是否有可能以某种方式完成以下操作:x.hpp-此文件包含在许多其他类中classx_impl;//forwarddeclareclassx{public://methods...private:x_impl*impl_;};x.cpp-实现#includetypedefconcrete_xx_impl;//obviouslythisdoesn'twork//implementationofmethods...所以基本上,我希望用户包含文件x.hpp,但不知道conrete_x.hppheader。由于我只能通过指针使用concrete_x,并且它仅作为私有(private)数据成员出现
C++里面有一些惯用法(idioms),如RAII,PIMPL,copy-swap、CRTP、SFINAE等。今天要说的是PIMPL,即PointerToImplementation,指向实现的指针。问题描述在实际的项目中,经常需要定义和第三方/供应商的C++接口。假如有这样一个接口文件:MyInterface.h#include#include#include"dds.h"classMyInterface{public:intpublicApi1();intpublicApi2();private:intprivateMethod1();intprivateMethod2();intpriv
我想使用pimpl习惯用法来避免我的库的用户需要我们的外部依赖项(如boost等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以代替的吗? 最佳答案 如果类是模板化的,您的用户基本上需要编译它(这在最广泛使用的C++实现中确实如此),因此他们需要您的外部依赖项。最简单的解决方案是将类的大部分实现放在非模板基类(或某个类的封装成员对象)中。解决那里的模块隐藏问题。然后编写模板派生(或封闭)类为其添加类型安全性。例如,假设您有一个模板,它提供了惊人的首次访问分配能力(省略了必要的复制构造函数、赋值、析构函
我想使用pimpl习惯用法来避免我的库的用户需要我们的外部依赖项(如boost等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以代替的吗? 最佳答案 如果类是模板化的,您的用户基本上需要编译它(这在最广泛使用的C++实现中确实如此),因此他们需要您的外部依赖项。最简单的解决方案是将类的大部分实现放在非模板基类(或某个类的封装成员对象)中。解决那里的模块隐藏问题。然后编写模板派生(或封闭)类为其添加类型安全性。例如,假设您有一个模板,它提供了惊人的首次访问分配能力(省略了必要的复制构造函数、赋值、析构函
我已经查看了问题here和here,但仍然无法找出问题所在。这是调用代码:#include"lib.h"usingnamespacelib;intmain(constintargc,constchar*argv[]){return0;}这是库代码:#ifndeflib_h#definelib_h#include#include#includenamespacelib{classFoo_impl;classFoo{public:Foo();~Foo();private:Foo(constFoo&);Foo&operator=(constFoo&);std::unique_ptrm_imp
我已经查看了问题here和here,但仍然无法找出问题所在。这是调用代码:#include"lib.h"usingnamespacelib;intmain(constintargc,constchar*argv[]){return0;}这是库代码:#ifndeflib_h#definelib_h#include#include#includenamespacelib{classFoo_impl;classFoo{public:Foo();~Foo();private:Foo(constFoo&);Foo&operator=(constFoo&);std::unique_ptrm_imp
我想使用pimplidiom和继承。这里是基础公共(public)类及其实现类:classA{public:A(){pAImpl=newAImpl;};voidfoo(){pAImpl->foo();};private:AImpl*pAImpl;};classAImpl{public:voidfoo(){/*dosomething*/};};并且我希望能够创建派生公共(public)类及其实现类:classB:publicA{public:voidbar(){pAImpl->bar();};//Can'tdo!pAimplisA'sprivate.};classBImpl:public
我想使用pimplidiom和继承。这里是基础公共(public)类及其实现类:classA{public:A(){pAImpl=newAImpl;};voidfoo(){pAImpl->foo();};private:AImpl*pAImpl;};classAImpl{public:voidfoo(){/*dosomething*/};};并且我希望能够创建派生公共(public)类及其实现类:classB:publicA{public:voidbar(){pAImpl->bar();};//Can'tdo!pAimplisA'sprivate.};classBImpl:public
c++中的pImpl习惯用法旨在向该类的用户隐藏该类的实现细节(=私有(private)成员)。然而,它也隐藏了该类的一些依赖关系,从测试的角度来看,这些依赖关系通常被认为是不好的。例如,如果A类将其实现细节隐藏在只能从A.cpp访问的AImpl类中,并且AImpl依赖于许多其他类,那么对A类进行单元测试就变得非常困难,因为测试框架无法访问AImpl的方法,也没有办法将依赖注入(inject)到AImpl中。以前有人遇到过这个问题吗?你找到解决办法了吗?--编辑--在一个相关主题上,似乎人们建议只测试接口(interface)公开的公共(public)方法,而不是内部方法。虽然我可以从