为基础类构造函数提供初始化的成员
Providing initialized members to base class constructor
假设我有缺陷的C 代码:
struct A final {
A(); // Initializes somethingShared
shared_ptr<Something> somethingShared;
};
struct B {
B(const A& a);
};
struct C : B {
C()
: B(a) {} // Uh-oh
A a;
};
C
应该 be-a B
,因此它从中继承。但是要初始化B
,我们需要A
的实例。C
必须提供一个,但是如何?在上面的代码中,a
用于非专业化,因为基地是在成员面前初始化的。我需要以某种方式在B
之前初始化A
。
如果 A
不是 final
,我可以从 A
私下继承:
struct C : private A, public B {
C()
: B(*this) {}
};
但是,由于是final
,我这样做:
namespace detail {
struct C_Base {
protected:
A a;
};
}
struct C : private detail::C_Base, public B {
C()
: B(detail::C_Base::a) {}
};
,或者我可以使用这样的怪异黑客:
struct C : B {
C(const A a = A())
: B(a),
a(a) {}
A a;
};
有更好的方法吗?
您可以使用私人构造函数和指针进行操作:
class C : B {
private:
const std::unique_ptr<A> m_aPtr;
C(A* a) : B(*a) , m_aPtr(a), m_a(*a){}
public:
C() : C(new A()) {}
A& m_a;
};
这将确保
-
A
在构造B
之前已完全构造 -
A
仅构造一次,而不是复制的 -
m_aPtr
将在课堂的寿命(由于const
)的寿命中保持有效,并将正确销毁A
在类破坏上(如本身成员) - 您可以将
m_a
与Intanced成员使用相同的语法使用,因为它是参考。如果对您来说还可以,您也可以将m_a
留下来,只使用指针m_aPtr
。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员