gpt4 book ai didi

c++ - 依赖成员初始化,当重新排序是不可能的

转载 作者:行者123 更新时间:2023-11-28 03:19:59 25 4
gpt4 key购买 nike

#include <iostream>
class BarParent
{
public:
int x;
virtual void fuz() = 0;
};

class BarChild : public BarParent
{
public:
BarChild(int new_x){x = new_x;}
virtual void fuz(){}
};

class FooParent
{
public:
BarParent* p_barPar;
FooParent (BarChild* new_p_bar)
{
p_barPar = new_p_bar;
std::cout << p_barPar->x << std::endl;
}
};

class FooChild: public FooParent
{
public:
BarChild barChild;
FooChild(int new_x):FooParent(&barChild), barChild(new_x){}
};
int main()
{
FooChild foo(60);

BarChild bar(99);
FooParent fooP(&bar);
}

输出:

-548726160 
99

我明白为什么我会得到这个结果(未定义的行为),barChild 在它被初始化之前被使用。我的问题是处理此问题的“权利”是什么。

最佳答案

在这种情况下,需要修复的是设计,而不是代码

根据您自己的设计:

  • BarChild 必须在 FooParent 之前构造。
  • FooParent 必须在 FooChild 之前构造。
  • FooChild 必须在 BarChild 之前构造。

当您希望 FooParentFooChild 都引用同一个 Bar 对象时 - 正如您在代码中尝试的那样 - 设计父类来管理它。

一个示例解决方案:

    FooParent (BarChild* new_p_bar)
{
if ( new_p_bar == NULL )
new_p_bar = new BarChild;

p_barPar = new_p_bar;
std::cout << p_barPar->x << std::endl;
}

在这里,FooChild 不需要它自己的这个对象的实例。

关于c++ - 依赖成员初始化,当重新排序是不可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734147/

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