构造函数中的引用初始化问题
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 中的某个地方。
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 中的某个地方。