gpt4 book ai didi

c++ - 如何正确初始化不可默认构造的类成员?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:54 26 4
gpt4 key购买 nike

假设我定义了一个类 Foo,它没有实现默认构造函数。此外,我还有一个 Bar 类,它“拥有”一个 Foo 的实例:

class Foo() {
private:
int m_member;
public:
Foo( int value ) : m_member(value) { }
};

class Bar() {
private:
Foo m_foo;
public:
Bar( /* ... */ ) {
int something;
/* lots of code to determine 'something' */
/* should initialize m_foo to 'Foo(something)' here */
}
};

显示的代码不会运行,因为 Bar 正在尝试调用 Foo 的默认构造函数。

现在我要做的是让 Bar 的构造函数首先确定 something 然后将结果传递给 Foo 的构造函数>.

解决此问题的一种方法是让 Bar 仅拥有对 Foo 的引用/指针,并在确定 m_something 后对其进行初始化。但是,我想避免这种情况,以明确 m_foo 的生命周期完全取决于所属类的生命周期。

另一种方法是在 Foo 中实现默认构造函数并稍后设置值,我也想避免这种情况,因为 Foo 的任何实例都应该有一个其成员的有效值(在任何时间)。

实现它的正确方法是什么?我在这里是否坚持引用/指针?

最佳答案

最好的想法是创建辅助函数,它会计算一些东西,然后在构造函数初始化列表中初始化 m_foo

class Bar {
private:
Foo m_foo;
public:
Bar( /* ... */ ) : m_foo(calculate_something()) {
}
private:
static int calculate_something()
{
int something = 0;
// lot of code to calculate something
return something;
}
};

关于c++ - 如何正确初始化不可默认构造的类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211287/

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