c++对象之间的关系

Relationships between C++ objects

本文关键字:关系 之间 对象 c++      更新时间:2023-10-16

我有一个行程向量和一个位置向量。旅行是在两个地方之间。

struct Data {
  std::vector<Journey> m_journeys;
  std::vector<Locations> m_locations;
};
struct Journey {
  ?? m_startLocation;
  ?? m_endLocation;
};

如何创建每个旅程和两个地点之间的关系?

我认为我可以只存储指向开始和结束位置的引用/指针,但是如果更多的位置添加到向量中,那么它将重新分配存储并移动内存中的其他位置,然后指向这些位置的指针将指向垃圾。

我可以存储地名,然后在Data中搜索列表,但这需要保持对Data的引用(破坏封装/SRP),然后进行不那么有效的搜索。

我认为如果所有的对象都是在堆上创建的,那么可以使用shared_ptr,(所以数据将包含std::vector<std::shared_ptr<Journey>>),那么这将工作吗?(这将需要大量重写,因此最好避免这样做)

是否有一些c++/STL功能,就像一个指针,但抽象了/是独立于内存位置(或顺序在向量)?

不,没有任何"c++/STL特性像指针一样,但抽象掉/独立于内存位置"。

这就对了。

对于类之间的这种关系来说,这不是正确的容器集合。你必须首先为你的对象选择合适的容器,而不是先选择一些任意的容器,然后试图弄清楚如何使它与你的关系一起工作。

使用std::shared_ptr s的向量是一种选择,只需要注意循环引用。另一个选择是使用std::list而不是std::vector,因为std::list在增长时不会重新分配。

如果每个Locations实例都有某种唯一标识符,使用std::map,然后使用该位置标识符引用一个位置,然后在地图中查找它。虽然std::map也不会在增长时重新分配,但间接层也提供了一些价值。

我会说为你的位置索引创建一个vector<shared_ptr<Location>>,而《Journey》将包含两个weak_ptr<Location>

struct Data {
    std::vector<Journey> m_journeys;
    std::vector<std::shared_ptr<Location>> m_locations;
};
struct Journey {
    std::weak_ptr<Location> m_startLocation;
    std::weak_ptr<Location> m_endLocation;
};

std::weak_ptr可以悬挂,这正是您想要的。:)

问题是可以访问包含已删除Location的Journey。弱指针提供了一个expired()方法,它可以告诉你父共享指针的数据(在你的m_locations向量中)是否仍然存在。

从弱指针访问数据是安全的,需要使用lock()方法。

下面是一个很好的例子,说明如何使用弱指针:http://en.cppreference.com/w/cpp/memory/weak_ptr/lock