草庐IT

pimpl-idiom

全部标签

c++ - 委派到私有(private)领域

有时,C++的隐私概念让我感到困惑:-)classFoo{structBar;Bar*p;public:Bar*operator->()const{returnp;}};structFoo::Bar{voidbaz(){std::coutbaz();//fine}由于Foo::Bar是private,我不能在main中声明b。但是我可以从Foo::Bar调用方法就好了。为什么这是允许的?这是意外还是有意为之?哦,等等,它变得更好了:Foof;autox=f.operator->();//:-)x->baz();即使我不能命名类型Foo::Bar,它也可以与auto一起使用...诺亚写道

c++ - 委派到私有(private)领域

有时,C++的隐私概念让我感到困惑:-)classFoo{structBar;Bar*p;public:Bar*operator->()const{returnp;}};structFoo::Bar{voidbaz(){std::coutbaz();//fine}由于Foo::Bar是private,我不能在main中声明b。但是我可以从Foo::Bar调用方法就好了。为什么这是允许的?这是意外还是有意为之?哦,等等,它变得更好了:Foof;autox=f.operator->();//:-)x->baz();即使我不能命名类型Foo::Bar,它也可以与auto一起使用...诺亚写道

c++ - 用于模板类的 pimpl

我想使用pimpl习惯用法来避免我的库的用户需要我们的外部依赖项(如boost等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以代替的吗? 最佳答案 如果类是模板化的,您的用户基本上需要编译它(这在最广泛使用的C++实现中确实如此),因此他们需要您的外部依赖项。最简单的解决方案是将类的大部分实现放在非模板基类(或某个类的封装成员对象)中。解决那里的模块隐藏问题。然后编写模板派生(或封闭)类为其添加类型安全性。例如,假设您有一个模板,它提供了惊人的首次访问分配能力(省略了必要的复制构造函数、赋值、析构函

c++ - 用于模板类的 pimpl

我想使用pimpl习惯用法来避免我的库的用户需要我们的外部依赖项(如boost等),但是当我的类被模板化时,这似乎是不可能的,因为方法必须在标题中。有什么我可以代替的吗? 最佳答案 如果类是模板化的,您的用户基本上需要编译它(这在最广泛使用的C++实现中确实如此),因此他们需要您的外部依赖项。最简单的解决方案是将类的大部分实现放在非模板基类(或某个类的封装成员对象)中。解决那里的模块隐藏问题。然后编写模板派生(或封闭)类为其添加类型安全性。例如,假设您有一个模板,它提供了惊人的首次访问分配能力(省略了必要的复制构造函数、赋值、析构函

c++ - unique_ptr、pimpl/forward 声明和完整定义

我已经查看了问题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

c++ - unique_ptr、pimpl/forward 声明和完整定义

我已经查看了问题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

c++ - 带有继承的 Pimpl 成语

我想使用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 成语

我想使用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++ - 默认定义的 move 构造函数上的 noexcept 规则是什么?

尤其是与std::vector相关的重要的是类型是noexcept尽可能move。所以在声明move构造函数时=default就像在structObject1{Object1(Object1&&other)=default;};std::is_nothrow_move_constructible::value将是true作为Object1的每个成员(此处为0)是不可move可构造的,答案是here.如果只声明move复制构造函数然后再声明会发生什么=default定义如下代码?structObject2{Object2(Object2&&other);};Object2::Object

c++ - 默认定义的 move 构造函数上的 noexcept 规则是什么?

尤其是与std::vector相关的重要的是类型是noexcept尽可能move。所以在声明move构造函数时=default就像在structObject1{Object1(Object1&&other)=default;};std::is_nothrow_move_constructible::value将是true作为Object1的每个成员(此处为0)是不可move可构造的,答案是here.如果只声明move复制构造函数然后再声明会发生什么=default定义如下代码?structObject2{Object2(Object2&&other);};Object2::Object