Учебный класс Owner
владеет несколькими объектами класса Item
с помощью unique_ptr
, Я хочу объекты Item
хранить ссылку (не указатель) на Owner
объекты, которым они принадлежат, со следующими требованиями:
Там никогда не может быть висячей ссылки.
Ссылка содержится в itm
объект класса Item
никогда не указывает на Owner
объект, которому не принадлежит itm
,
Item
Объект всегда имеет владельца.
Item
класс будет использоваться через его подклассы.
Я попытался автоматически зарегистрировать объекты Item
класс во время строительства (в Item::Item()
), но это приводит к двойному удалению, когда они создаются в стеке. Следовательно, мне, вероятно, нужно предотвратить их создание в стеке. Но это проблема, когда я делаю их на подклассы. Существует ли более простой способ обеспечить правильность взаимных связей, не ослабляя при этом ни одно из требований? Я подозреваю, что 3. возможно, придется ослабить, чтобы сначала создать объект и зарегистрировать его с помощью Owner
потом.
Чтобы уточнить мой комментарий, если вы делаете Item
S конструктор частный, и взять ссылку на владельца на строительство. Тогда вы можете сделать Owner
класс друга, или как в моем примере сделать один из Owner
с функцией друга.
Сюда Item
Их можно создать только здесь и больше нигде. Когда они созданы, они получают ссылку на Owner
непосредственно.
Ссылка в Item
всегда будет действительным, так как, когда Owner
уничтожается 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.
Других решений пока нет …