我试图允许一个类包含一个指针,它可以是一个拥有的指针或一个借来的指针.在前一种情况下,它应该破坏拥有的对象本身;在后一种情况下,它不应该破坏指向的对象.
在代码中,我有类A,B和C.我的目标是以下(简化)定义,其中B是需要拥有指针的类:
class C {
...
};
class B {
C *c;
B(C *c) : c(c) {
}
};
class A {
C c1;
B b1, b2;
// b2 leaks pointer to C
A() : b1(&c1), b2(new C()) {
}
};
当A的实例破坏时,它会破坏c1,b1和b2.理想情况下,b2的破坏应该删除匿名C实例,但是b1的破坏不应该删除任何东西(因为c1将被A直接销毁).
我可以使用什么样的智能指针来实现这一目标?或者,是将所有权标志传递给B的最佳解决方案?
最佳答案 虽然我担心B可能会受到滥用,但您可以这样做:
class B {
C *c;
bool owned;
B(C& c) : c(&c), owned(false) {}
B(C *c) : c(c), owned(true) {}
~B() { if (owned) delete c; }
};
class A {
C c1;
B b1, b2;
A() : b1(c1), b2(new C()) {}
};