c++对象之间的关系
Relationships between C++ objects
我有一个行程向量和一个位置向量。旅行是在两个地方之间。
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
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 移动语义和深层/浅层复制之间有什么关系?
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 超市管理系统的类别之间应该是什么关系?
- 指针和程序性能之间有什么关系吗?
- node.h/node.cpp/nodelist.cpp之间的关系
- 运行线程和线程对象之间的关系
- 类型大小与其值范围之间的关系?
- 2个期货之间的依赖关系
- Qt:工作线程和 GUI 事件之间的关系
- 如何强制 qbs 产品与依赖关系之间的同步?
- 在头文件和 .cc 文件之间建立关系
- C 和Windows OS之间的关系
- 为什么赋值运算符和相等运算符之间没有 1:1 的关系?
- QComboBox 在 editTextChanged 和 currentIndexChanged 之间的关系
- 使用 .depends 指定 SUBDIRS 项目之间的依赖关系不起作用
- 各种初始化和构造之间的关系
- 变量之间的关系
- Objective-C源代码和clang -rewrite-objc C++代码之间有什么关系?