C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
C++: How to call member constructor outside the initializer list during object construction?
我想在owners构造函数中调用成员对象的构造函数,但由于依赖关系,无法在初始值设定项列表中构造成员对象。初始化后如何调用构造函数?我真的不想使用init方法
否。
不能在初始值设定项列表之外调用成员类的构造函数。
PS:即使你没有在初始值设定项列表中自己调用它,编译器也会隐式调用它。
如果您不能在初始值设定项列表中调用它,并且您不想使用类似init的方法,那么请重新考虑您的设计/方法。
您有两个选项:要么使用动态存储,要么放置新的。
第一个是显而易见的(正如评论中所指出的,您可以使用unique_ptr
(。如果你想避免这种情况,你可以尝试用std::aligned_union
作为存储的新位置:
class SomeClass { ... };
class Owner
{
public:
Owner()
{
m_ptr = new(&m_storage) SomeClass();
}
~Owner()
{
m_ptr->~SomeClass();
}
private:
std::aligned_union<0, SomeClass> m_storage;
SomeClass* m_ptr;
};
注意:在这种情况下,您负责调用对象的析构函数,如上所示。
您可以用unique_ptr
包装m_ptr
(带有只调用析构函数的deleted(来避免这种情况:
struct DtorDeleter
{
template<typename T>
void operator ()(T* ptr) { ptr->~T(); }
};
std::unique_ptr<SomeClass, DtorDeleter> m_ptr; // no need to call destructor manually
您可以为此使用并集(需要C++11(:
#include <new>
class Foo {
public:
Foo(int a) { }
};
class Bar {
public:
Bar() {
new(&m_foo) Foo(42); // call the constructor
// you can use m_foo from this point
}
~Bar() {
m_foo.~Foo(); // call the destructor
}
private:
union { // anonymous union
Foo m_foo;
};
};
请注意,您需要在~Bar()
显式调用m_foo
的析构函数。
想要在所有者构造函数中调用成员对象的构造函数,但由于依赖而无法在初始值设定项列表中构造成员对象
您可以修改类以获得正确的依赖顺序,也可以使用委托构造函数:
所以转向:
struct S
{
S(/*..*/) : /*m1(data), m2(data),*/ data(/*..*/) // Issue, m1, m2 constructed before data
{
ComplexData2 data2 = Query();
m1.init(data, data2.someField1); // Doesn't like init method
m2.init(data, data2.someField2); // Doesn't like init method
}
Member1 m1; // Cannot be const with init method :/
Member2 m2; // Cannot be const with init method :/
ComplexData data;
};
进入
struct S
{
S(/*..*/) : S(Query() /*, ..*/) {}
// private: // probably private
S(const ComplexData2& data2 /*, ..*/) :
data(/*..*/),
m1(data, data2.someField1),
m2(data, data2.someField2)
{
}
public:
ComplexData data; // Before m1, m2 for dependencies.
/*const*/ Member1 m1; // Can be const
/*const*/ Member2 m2; // Can be const
};
相关文章:
- 一对向量构造函数:初始值设定项列表与显式构造
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 构造函数/函数声明参数列表中的统一初始化
- 在初始化列表之外手动调用基类的构造函数
- 采用初始值设定项列表的构造函数
- 提供初始值设定项列表构造函数的有效方法
- C 标准中是否有任何计划来解决初始化器列表构造函数的不一致性
- 接受迭代器的初始值设定项列表构造函数
- STD :: MAP初始化列表构造函数
- 如何避免丢失自动生成的初始化列表构造函数
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- 初始化列表构造函数错误带有CRTP
- 启用默认初始值设定项列表构造函数
- 使用初始化列表构造函数时C++奇怪的行为
- 自定义列表类的初始值设定项列表构造函数
- 初始值设定项列表构造函数导致右值构造函数不明确
- 调用初始化列表构造函数的不同方式
- 为什么std::array不包含初始化列表构造函数
- C++ 为类模板提供初始值设定项列表构造函数
- 何时使用初始值设定项列表构造函数