C++ 如何安全地将对所有者的引用存储在自有C++;对象

C++ 如何安全地将对所有者的引用存储在自有C++;对象,c++,reference,unique-ptr,ownership-semantics,C++,Reference,Unique Ptr,Ownership Semantics,类Owner通过unique\ptr拥有类项的多个对象。我希望Item的对象存储指向拥有它们的Owner对象的引用(而不是指针),并满足以下要求: 永远不会有悬而未决的参考 类项的itm对象中包含的引用从不指向不拥有itm的Owner对象 项对象始终具有所有者 Item类将通过其子类使用 我尝试在构建过程中(在Item::Item()中)自动注册Item类的对象,但在堆栈上创建时会导致双重删除。因此,我可能需要防止在堆栈上创建它们。但当我对它们进行子类化时,这是一个问题。有没有更简单的方法来确保

Owner
通过
unique\ptr
拥有类
项的多个对象。我希望
Item
的对象存储指向拥有它们的
Owner
对象的引用(而不是指针),并满足以下要求:

  • 永远不会有悬而未决的参考

  • itm
    对象中包含的引用从不指向不拥有
    itm
    Owner
    对象

  • 对象始终具有所有者

  • Item
    类将通过其子类使用


  • 我尝试在构建过程中(在
    Item::Item()
    中)自动注册
    Item
    类的对象,但在堆栈上创建时会导致双重删除。因此,我可能需要防止在堆栈上创建它们。但当我对它们进行子类化时,这是一个问题。有没有更简单的方法来确保相互链接始终正确,而不放松任何要求?我怀疑是3。可能必须放宽限制,以便首先创建对象,然后将其注册到
    所有者

    若要详细说明我的评论,请将
    的构造函数设置为私有,并在构建时参考所有者。然后,您可以将
    Owner
    设置为friend类,或者如我的示例所示,将
    Owner
    s函数中的一个设置为friend函数

    这样,只能在此处创建
    s,而不能在其他任何地方创建。当它们被创建时,它们直接获得对
    所有者的引用

    项目
    中的引用将始终有效,因为当
    所有者
    被销毁时,其拥有的
    项目
    将与其一起销毁

    #include <iostream>
    #include <vector>
    #include <memory>
    
    class Item;
    
    class Owner {
        public:
        std::vector<std::unique_ptr<Item>> foos;
    
        void makeItem();
    };
    
    class Item {
        Item(Owner& b) : owner(b) {}
    
        friend void Owner::makeItem();
        Owner& owner;
    };
    
    void Owner::makeItem() {
        foos.emplace_back(new Item(*this));
    }
    
    int main() {
        Owner b;
        //Item item(b); not allowed, constructor is private
        b.makeItem();
    }
    
    #包括
    #包括
    #包括
    类别项目;
    类所有者{
    公众:
    std::矢量foos;
    void makeItem();
    };
    类项目{
    项目(所有者和b):所有者(b){}
    好友无效所有者::makeItem();
    业主&业主;
    };
    void所有者::makeItem(){
    foos.安置(新项目(*本));
    }
    int main(){
    业主b;
    //项(b);不允许,构造函数是私有的
    b、 makeItem();
    }
    

    不完全确定第4点的意思。

    我的问题中有什么不清楚?任何澄清的建议都是非常受欢迎的。如果
    s是在堆栈上创建的,我认为堆栈的意思是它们有自动存储,那么
    所有者
    实际上并不拥有它们,至少在资源方面是这样的。除此之外,在
    项目
    中提及
    所有者
    似乎符合要求。谢谢。因此,为了确保
    项目
    始终归
    所有者
    所有,我必须阻止
    项目
    的自动存储?如果您确保只允许
    所有者
    构建
    项目
    ,并且在构建时将引用传递到
    中,您的所有要点都应该包括在内。您确定
    确实需要存储反向引用吗?或者可以通过访问它的方式提供吗?我怀疑
    Foo
    将是一个基类。您的示例可能需要修改以允许创建自定义的
    Foo
    s,但我想模仿
    std
    emplace
    是可能的,而且相对容易。@luk32您可能是对的。我不清楚OPs的目的是什么,也不清楚
    项的用法,所以我把它省略了。