构造函数中的引用初始化问题

Problem with reference initialization in constructor

Class伪定义:

虚拟基地Class答:

class A {
public:
    virtual ~A();
    virtual void doSomething() const = 0;
};

Class B 继承自 A:

class B : public A {
public:
    void doSomething() {} const;
}

虚拟基地Class C:

class C {
public:
    virtual ~C();
    virtual void doSomething() const = 0;
};

Class D 继承自 C:

class D : public C {
public:
    D(const &A _a = *A_Ptr(new B)) : a(_a) {}
    void doSomething() {} const;
private:
    const &A a;
}

A_Ptr 是 class A.

共享指针的类型定义

我的问题是声明另一个 class。

我们称它为 class X:

class X {
public:
    X(const &A _a = *A_Ptr(new B), const &C _c = *C_Ptr(new D(a)) : a(_a), c(_c) {}
private:
    const &A a;
    const &C c;
}

X(const &A _a = *A_Ptr(new B), const &C _c = *C_Ptr(new D(a)) - 这部分初始化不起作用。起作用的是

X(const &A _a = *A_Ptr(new B), const &C _c = *C_Ptr(new D)

但是如果我这样做,我会创建两个 class A 类型的共享指针,这不是我想要的。另一方面,X(const &A _a = *A_Ptr(new B), const &C _c = *C_Ptr(new D(a))X(const &A _a = *A_Ptr(new B), const &C _c = *C_Ptr(new D(_a)) 之类的东西不起作用。有什么已知的方法可以解决这个问题吗?

提前致谢:)

如果我没理解错的话,您需要一个 class,它可以使用外部资源,也可以管理自己的资源。如果是这种情况,您必须允许 class 执行这两项操作。我相信它可以像这样工作:

class D : public C {
public:
    D() : myA(new B), a(*myA) {}
    D(const &A _a) : a(_a) {}
    void doSomething() {} const;
private:
    std::unique_ptr<A> myA;
    const &A a;
}

这样,D 可以在没有参数的情况下创建,并且可以正确管理绑定到 a 的对象的生命周期,或者可以使用外部提供的 A 创建并且不会自己创建任何东西。

可以对 X 进行类似的更改:

class X {
public:
    X() : myA(new B), a(*myA), myC(new D(a)), c(*myC) {}
    X(const &A _a) : a(_a), myC(new D(a)), c(*myC) {}
    X(const &A _a, const &C _c) : a(_a), c(_c) {}
private:
    std::unique_ptr<A> myA;
    const &A a;
    std::unique_ptr<C> myC;
    const &C c;
}

请注意,您的原始代码有悬空引用,因为当构造函数 运行 完成时,作为默认参数创建的智能指针超出范围。这就是为什么它们必须像上面的解决方案一样存储在 class 中的某个地方。