Как безопасно хранить ссылку на владельца в принадлежащем C ++ объекте?

Учебный класс Owner владеет несколькими объектами класса Item с помощью unique_ptr, Я хочу объекты Item хранить ссылку (не указатель) на Owner объекты, которым они принадлежат, со следующими требованиями:

  1. Там никогда не может быть висячей ссылки.

  2. Ссылка содержится в itm объект класса Item никогда не указывает на Owner объект, которому не принадлежит itm,

  3. Item Объект всегда имеет владельца.

  4. Item класс будет использоваться через его подклассы.

Я попытался автоматически зарегистрировать объекты Item класс во время строительства (в Item::Item()), но это приводит к двойному удалению, когда они создаются в стеке. Следовательно, мне, вероятно, нужно предотвратить их создание в стеке. Но это проблема, когда я делаю их на подклассы. Существует ли более простой способ обеспечить правильность взаимных связей, не ослабляя при этом ни одно из требований? Я подозреваю, что 3. возможно, придется ослабить, чтобы сначала создать объект и зарегистрировать его с помощью Owner потом.

-2

Решение

Чтобы уточнить мой комментарий, если вы делаете ItemS конструктор частный, и взять ссылку на владельца на строительство. Тогда вы можете сделать Owner класс друга, или как в моем примере сделать один из Ownerс функцией друга.

Сюда ItemИх можно создать только здесь и больше нигде. Когда они созданы, они получают ссылку на Owner непосредственно.

Ссылка в Item всегда будет действительным, так как, когда Owner уничтожается Items он владеет, уничтожается вместе с ним.

#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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]