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的目的是什么,也不清楚项的用法,所以我把它省略了。