将const引用向下传递到构造函数链中

Passing a const reference down a chain of constructors

本文关键字:构造函数 const 引用      更新时间:2023-10-16

我在下面的代码中遇到了一个运行时错误,这是我实际代码的可复制缩减。我确信我没有正确地实例化某个东西,但我无法弄清楚它是什么

#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:...

它应该起作用。

BTW:我几乎总是将带有一个参数的构造函数声明为显式的。这样做,编译器会警告您。

您正试图参照D::myA初始化D::myC,这是不正确的,因为对象目前还没有完全构造好。

D::D(const int k) : myA(k), myC(myA) {}
相关文章: