gpt4 book ai didi

c++ - 向基类构造函数提供初始化成员

转载 作者:太空狗 更新时间:2023-10-29 22:56:31 27 4
gpt4 key购买 nike

假设我有这样有缺陷的 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 私有(private)继承:

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;
};

有更好的方法吗?

最佳答案

您可以使用私有(private)构造函数和指针来实现:

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,因为它是一个引用。如果你觉得合适,你也可以离开 m_a 并只使用指针 m_aPtr

关于c++ - 向基类构造函数提供初始化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47726388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com