在C ++中使用父引用

时间:2014-01-29 19:16:19

标签: c++ inheritance reference

我想知道是否使用某个界面的引用而不是指针可能会导致我忽略的一些复杂问题。我想要这样做的原因是要弄清楚哪些对象应该“删除”在构造时给它们的指针以及哪些应该只使用它而不用担心其他对象的生命周期以允许多个实例共享一个对象。 (shared_ptr不是一个选项)

以下是一个例子:

class Parent
{
public:
    virtual void WhoAmI() { printf("Parent\n"); }
};
class Child : public Parent
{
public:
    void WhoAmI() { printf("Child\n"); }
};

class ParentUser
{
public:
    ParentUser(Parent& parent)  : _parent(parent)   {}
public:
    Parent& _parent;
};

class ParentOwner
{
public:
    ParentOwner(Parent* pParent): _pParent(pParent), _parentUser(*pParent) {}
    ~ParentOwner() { delete _pParent; }
public:
    Parent*     _pParent;
    ParentUser _parentUser; 
};


int main ()
{   
    Parent* pParent = new Child();
    ParentOwner parentOwner(pParent);
    parentOwner._parentUser._parent.WhoAmI();

    char stopper;
    cin >> stopper;
    return 0;
}

这个工作正常,输出是预期的:'孩子'

2 个答案:

答案 0 :(得分:0)

一般来说,分配内存的对象应该是可以释放它的 在其他对象中删除它可能会导致麻烦。

想象一下这种情况:

  1. 对象A创建“Obj”。
  2. 对象A将其传递给对象B
  3. 对象B删除它。
  4. 删除了不知道“Obj”的对象A现在将其传递给对象C.
  5. 对象C尝试使用“Obj”。 BOOM!

答案 1 :(得分:0)

您使用引用来指示使用对象和指示所有权的指针是完全正常的。您只需定义自己的所有权约定,只要所有代码都遵循该约定,所有内容都应该。请注意,系统中只能有一个对象具有指向要删除的对象的指针。

在您的示例中,Child对象只能作为构造函数参数传递给一个ParentOwner对象。