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

问题描述 投票:1回答:1

类伪定义:

基础虚拟A类:

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

B类继承自A:

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

基础虚拟类C:

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

继承自C的D类:

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

A_Ptr是类A的共享指针的typedef。

我的问题是宣布另一个班级。

让我们称它为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)

但是如果我这样做的话,我会创建两个类型为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))这样的东西不起作用。有没有任何已知的方法来解决这个问题?

提前致谢 : )

c++ reference initialization smart-pointers
1个回答
2
投票

如果我理解正确,您需要一个使用外部资源或管理自己的资源的类。如果是这种情况,您必须允许该课程同时执行这两项操作。我相信它可以像这样工作:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.