我收到以下代码的运行时错误,这是我实际代码的可重现缩减。我确定我没有正确实例化某些东西,但我无法弄清楚它是什么。
#include <iostream>
using namespace std;
class A {
int n;
public:
A();
A(const int k);
int getn() const { return n; };
};
A::A() : n(0) {};
A::A(const int k) : n(k) {}
class B {
const A& myA;
public:
B(const A& anA);
int getn() const { return myA.getn(); };
};
B::B(const A& anA) : myA(anA) {}
class C {
const A& myA;
const B& myB;
public:
C(const A& anA);
int getn() const { return myB.getn(); };
};
C::C(const A& anA) : myA(anA), myB(myA) {}
class D {
A myA;
C myC;
public:
D(const int k);
int getAn() const { return myA.getn(); };
int getCn() const { return myC.getn(); };
};
D::D(const int k) : myA(k), myC(myA) {}
int main() {
D myD(10);
cerr << "A: " << myD.getAn() << '\n';
cerr << "C: " << myD.getCn() << '\n';
}
我要么在输出的第二行出现段错误,要么在“C:0”而不是我期望的“C:10”。
最佳答案
问题出在这一行:
C::C(const A& anA) : myA(anA), myB(myA) {}
myB 是一个引用。但是为了什么?答案是暂时的。 myB(myA)
将构造一个分配给您的引用的临时对象。不幸的是,这个对象将在 Ctor 退出后被销毁。
将您的代码更改为以下内容:
class C {
const A& myA;
const B myB;
public:...
它应该可以工作。
顺便说一句:我几乎总是将带有一个参数的构造函数声明为显式的。这样做,编译器会警告你。
关于c++ - 将 const 引用传递到构造函数链中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6425624/