正确使用父/子关系的唯一ptr 我对C++和智能指针比较陌生,因为我主要使用C语言。我在这里遇到了大量关于unique_ptr的正确用法的问题,我想我理解智能指针都是关于所有权的,当指针超出范围时,谁将负责删除指针所持有的内存

正确使用父/子关系的唯一ptr 我对C++和智能指针比较陌生,因为我主要使用C语言。我在这里遇到了大量关于unique_ptr的正确用法的问题,我想我理解智能指针都是关于所有权的,当指针超出范围时,谁将负责删除指针所持有的内存,c++,unique-ptr,C++,Unique Ptr,也就是说,下面的例子是否正确?父母永远是孩子的主人,管理孩子的一生。但是,如果另一个类需要容纳一个子类,并且总是比该子类活得少,那么该类是否可以容纳指向该子类的原始指针 class ChildTypeA; class ChildTypeB; class Parent { public: ChildTypeA* createChildA() { ChildTypeA *aPtr = new ChildTypeA(/* pass this to constructo

也就是说,下面的例子是否正确?父母永远是孩子的主人,管理孩子的一生。但是,如果另一个类需要容纳一个子类,并且总是比该子类活得少,那么该类是否可以容纳指向该子类的原始指针

class ChildTypeA;
class ChildTypeB;

class Parent
{
public:
    ChildTypeA* createChildA()
    {
        ChildTypeA *aPtr = new ChildTypeA(/* pass this to constructor */);
        typeAChildren.push_back(std::unique_ptr<ChildTypeA>(aPtr));

        return aPtr;
    }

    ChildTypeB* createChildB()
    {
        ChildTypeB *aPtr = new ChildTypeB(/* pass this to constructor */);
        typeBChildren.push_back(std::unique_ptr<ChildTypeB>(aPtr));

        return aPtr;
    }

    void somethingCalledByChildA()
    {}

    void somethingCalledByChildB()
    {}

private:
    std::vector<std::unique_ptr<ChildTypeA>> typeAChildren;
    std::vector<std::unique_ptr<ChildTypeB>> typeBChildren;
};

class ChildTypeA
{
public:
    ChildTypeA() {} // parameterless constructor purely for single file example
    ChildTypeA(Parent *parent) : owningParent(parent)
    {}

    void notifyParentOfSomethingA()
    {
        owningParent->somethingCalledByChildA();
    }

    void doSomethingOnThisChild()
    {}

private:
    Parent *owningParent;

};

class ChildTypeB
{
public:
    ChildTypeB() {} // parameterless constructor purely for single file example
    ChildTypeB(Parent *parent) : owningParent(parent)
    {}

    void notifyParentOfSomethingB()
    {
        owningParent->somethingCalledByChildB();
    }

private:
    Parent *owningParent;

};

class SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA
{
public:
    SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA(ChildTypeA *child) : childNotOwnedByMe(child)
    {}

    void doSomething()
    {  
       childNotOwnedByMe->doSomethingOnThisChild();
    }

private:
    ChildTypeA * childNotOwnedByMe;
};

这个例子是正确的,
unique\u ptr
是关于所有权的,这并不妨碍从其他类引用原始指针,需要记住的是:

1) 使用前请检查原始指针


2)不要在原始指针上调用<代码>删除>代码。< /P>您可能需要考虑使用引用而不是PoTIN。如果您只观察到某个东西,则原始指针执行该作业。这包括持有父指针的孩子。我确实考虑过将父引用传递给ChildA /B,但是在另一个帖子上读到,引用类成员可能是有问题的,特别是如果我需要更改拥有的父代时。谢谢!可能最终会用智能指针来理解所有权。

ChildTypeA *a = someInstanceOfParent->createChildA();
auto x = new SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA(a);