gpt4 book ai didi

c++ - 如何防止使用尚未构造的类成员?

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

我有以下类(class):

class A
{
public:
A() { x = 0; std::cout<<"A default ctor()\n"; }
A(int x_) { x = x_; std::cout<<"A normal ctor()\n"; }
int x;
};

class B
{
public:
B() { std::cout<<"B ctor()\n"; }
private:
std::string str;
};

和一个以对象 A 作为参数创建对象 B 的函数:

B
createB(const A& a) {
std::cout<<"a int: "<<a.x<<"\n";
return B();
}

如果我设计一个 C 类,它具有类型 A 和 B 的成员,并在构造 A 对象之前构造 B 对象但是使用 A 对象来这样做,这将在没有编译的情况下进行编译警告,但它会默默地输入错误:

class C
{
public:
C(): b(createB(a)), a(10) {}
private:
B b;
A a;
};


int main()
{
C c;
return 0;
}

当然,上面的例子是一个微不足道的例子,但我在现实世界中看到过它,代码复杂得多(现在是星期五,晚上 8:30,我刚刚修复了导致段错误的错误)。

如何防止这种情况发生?

最佳答案

我同意其他人的建议,即设计者有责任确保在使用前初始化对象。在您的案例中,我看到了两种方法:

首先(也是最简单的),颠倒类定义中 ab 的顺序:

class C
{
public:
C(): b(createB(a)), a(10) {}
private:
A a;
B b;
};

其次,如果您想真正强调它的初始化发生在其他成员之前,您可以将a 移动到基类:

class CBase
{
protected:
CBase(): a(10) {}
protected:
A a;
};

class C : private CBase
{
public:
C(): b(createB(a)) {}
private:
B b;
};

关于c++ - 如何防止使用尚未构造的类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13091561/

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