-2

类通过Owner拥有多个类对象。我希望对象存储对拥有它们的对象的引用(不是指针) ,具有以下要求:Itemunique_ptrItemOwner

  1. 永远不可能有一个悬空的参考。

  2. itm类对象中包含的引用Item永远不会指向Owner不拥有的对象itm

  3. 一个Item对象总是有一个所有者。

  4. Item类将通过其子类使用。

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

4

1 回答 1

2

为了详细说明我的评论,如果您将Item构造函数设为私有,并在构造时引用所有者。然后你可以创建Owner一个朋友类,或者在我的例子中让一个Owners 函数成为朋友函数。

这种方式Items 只能在此处创建,而不能在其他任何地方创建。当它们被创建时,它们会Owner直接获得对的引用。

in 的引用Item将始终有效,因为当sOwner被销毁时Item,它拥有的 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();
}

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

于 2018-06-17T23:29:40.177 回答