假设我有以下有缺陷的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
应该是 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;
};
有更好的方法吗?
struct B
中包含A a
,并将其实例传递给B
的构造函数,例如:B(const A& _a) : a(_a)
,从C
的构造函数中调用:C(const A& a = A()) : B(a) { }
或者C() : B(A)) { }
。 - rosengrenenA
或B
。C
需要一个A
成员,并且需要继承自B
。我正在寻找满足这些限制条件的解决方案。 - basteln