构造函数中的引用初始化问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数中的引用初始化问题相关的知识,希望对你有一定的参考价值。
类伪定义:
基础虚拟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))
这样的东西不起作用。有没有任何已知的方法来解决这个问题?
提前致谢 : )
如果我理解正确,您需要一个使用外部资源或管理自己的资源的类。如果是这种情况,您必须允许该课程同时执行这两项操作。我相信它可以像这样工作:
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;
}
请注意,您的原始代码具有悬空引用,因为在构造函数运行完成时,作为默认参数创建的智能指针超出了范围。这就是为什么它们必须存储在类中的某个地方,正如上面的解决方案那样。
以上是关于构造函数中的引用初始化问题的主要内容,如果未能解决你的问题,请参考以下文章
java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序
接受对抽象类的 const 引用的 C++ 构造函数无法初始化 std::map