У меня есть класс TileManager который управляет временем жизни объектов и, следовательно, хранит в них shared_ptr:
class TileManager {
private:
std::vector<std::shared_ptr<const Tile>> tiles;
}
Теперь у меня есть другой класс карта который содержит не владеющие ссылками на объекты, управляемые TileManager:
class Map {
private:
std::vector<std::weak_ptr<const Tile>> tiles;
}
Моя проблема: я не хочу карта класс, чтобы иметь возможность манипулировать умными указателями на Плитка. Поэтому я хотел бы сделать указатели внутри вектор Const:
class Map {
private:
std::vector<const std::weak_ptr<const Tile>> tiles;
}
К сожалению, невозможно поместить объекты const в контейнер STL.
Кто-нибудь знает решение? Может быть, совершенно другой дизайн?
Элементы хранятся в vector
не может быть const
потому что они должны быть назначаемыми. Единственный способ, которым vector
может «манипулировать» указателями любым заметным образом, будет уничтожать последние weak_ptr
к данному объекту, который будет вызывать блок управления для соответствующего shared_ptr
быть освобожденным (при условии, что нет другого shared_ptr
Это все еще ссылка).
Короче говоря, вы можете безопасно хранить неconst
weak_ptr
в векторе.
Если возможно, вы можете использовать std::set
, Поскольку единственный способ получить доступ к данным из набора предоставляет только константные ссылки или константные итераторы, вы не можете напрямую манипулировать значениями.
Для этого вы бы использовали
std::set<std::weak_ptr<const Tile>, std::owner_less<std::weak_ptr<const Tile>>>
,
Другое, нетехнологичное решение — сделать это по замыслу, поскольку оно является частным членом того, что, по-видимому, является вашим классом: просто скажите в своем дизайне класса «Не сбрасывайте и не перезаписывайте слабые указатели».