构造函数初始值设定项列表中的共享参数
Shared argument in constructor initializer list
我有这样的类:
class A
{
public:
A(std::shared_ptr<SomeClass> p);
private:
std::shared_ptr<SomeClass> _p;
};
class B
{
public:
B(std::shared_ptr<SomeClass> p);
private:
std::shared_ptr<SomeClass> _p;
};
class Foo
{
public:
Foo();
private:
A _a;
B _b;
};
来自A
和B
的两个构造函数参数共享相同的指针引用shared_ptr
。在这种情况下:
初始化
Foo
的最佳方式是什么?是否仍然可以在
Foo
的构造函数中使用初始化列表?
我很困惑,因为两个类都需要相同的shared_ptr
实例,所以我必须将指针存储在某个地方,而我认为这在初始化列表中是不可能的。
此外,如果初始化发生在构造函数的主体中,则意味着A
和B
都应该有move
构造函数,对吗?因为我必须做这样的事情:
Foo::Foo() //: Cannot use initializer list
{
auto ptr = std::make_shared<SomeClass>(SomeClass());
_a = A(ptr);
_b = B(ptr);
}
实际上,我想到了一个更好的解决方案。创建shared_ptr
,然后委托给一个私有构造函数,该构造函数将使用它来构造_a
和_b
。(感谢Zan Lynx建议使用函数参数作为临时存储。)
class Foo {
public:
Foo(): Foo(std::make_shared<SomeClass>()) {}
private:
Foo(std::shared_ptr<SomeClass> ptr): _a(ptr), _b(ptr) {}
A _a;
B _b;
};
您不能初始化构造函数主体中的成员。当主体开始执行时,成员必须已经初始化。因此,如果您尝试这样做,成员将是默认构造的,然后您将只分配给它们。A
和B
没有默认构造函数,因此不会编译。
如果你能负担得起尺寸的增加,那么让shared_ptr
也成为Foo
的成员并使用它。
class Foo {
public:
Foo(): _ptr(std::make_shared<SomeClass>()), _a(_ptr), _b(_ptr) {}
private:
std::shared_ptr<SomeClass> _ptr;
A _a;
B _b;
};
考虑到您定义类的方式(即无法访问内部shared_ptr
),我认为您的解决方案很好。但请注意,A
和B
将需要默认构造函数。这就是在您进入构造函数主体之前初始化它们的方式。
此外,一旦您进入构造函数主体,您将执行赋值。因此A
和B
都需要一个赋值运算符。
此外,我觉得将std::shared_ptr
作为引用传递到函数(包括构造函数)中是一种很好的做法。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何将共享指针列表传递到pybind11中的c++对象
- 如何在成员初始化列表中声明共享指针
- 我对C 中共享指针列表进行排序的功能未完成类型
- 为多个类实例维护共享_ptr的静态列表
- 在C 中共享线程之间的列表
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 使用共享_ptr删除列表中的对象
- 具有共享指针的列表的共享指针
- 复制包含共享指针列表的共享指针后面的对象
- c 过载[]用于std ::包含共享_ptr的列表
- 构造函数初始值设定项列表中的共享参数
- 如何在Windows平台中获取远程Windows服务器的共享文件夹的文件列表
- c++主外部函数之间的共享列表
- 如何从c++中获得可执行的共享库列表
- 共享列表、多个条件、一个或多个条件变量
- 通过属性在c++和QML之间共享数组或列表