加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何防止使用尚未构建的类成员?

发布时间:2020-12-16 07:33:04 所属栏目:百科 来源:网络整理
导读:我有以下课程: 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;}; 以及创建对象B的函数,将对象A作
我有以下课程:

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

以及创建对象B的函数,将对象A作为参数:

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

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

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


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

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

我怎样才能防止这种情况发生?

解决方法

我同意其他人的建议,即设计师有责任确保在使用前初始化对象.在你的情况下,我看到两种方法:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读