C++ 循环依赖关系;包括「;及;在“中”;
我想就以下问题征求你的意见 我们有一门课叫“房间”。每个文件室可能包含零个或多个“Person”类实例,因此该文件室存储一组人员(例如vector)。它拥有它们。但是,在房间之间移动人员有一些耗时的逻辑,因此人员还包含他们所在的当前房间。它只是一个没有所有权的指针。这个信息在理论上是多余的,因为人们可以从房间里的人的集合中得到它,但是假设房间数量很大>>人的数量,这样的操作会很慢C++ 循环依赖关系;包括「;及;在“中”;,c++,architecture,software-design,C++,Architecture,Software Design,我想就以下问题征求你的意见 我们有一门课叫“房间”。每个文件室可能包含零个或多个“Person”类实例,因此该文件室存储一组人员(例如vector)。它拥有它们。但是,在房间之间移动人员有一些耗时的逻辑,因此人员还包含他们所在的当前房间。它只是一个没有所有权的指针。这个信息在理论上是多余的,因为人们可以从房间里的人的集合中得到它,但是假设房间数量很大>>人的数量,这样的操作会很慢 class Room { std::vector<Person> peopleInside; }; c
class Room {
std::vector<Person> peopleInside;
};
class Person {
Room* currentRoom; //could be shared_ptr to avoid raw pointers
};
教室{
性病:病媒人群;
};
班主任{
Room*currentRoom;//可以共享\u ptr以避免原始指针
};
当然,它更复杂(类有比这更多的内容),但我已经尽可能地简化了它
我的问题是:
1) 在这种情况下,这本身就是一种循环依赖吗
2) 这个解决方案对你来说是否肮脏/不雅观
3) 它值得换成别的东西吗?这个问题确实需要在上下文中研究。如果
Person
s仅存在于Room
的上下文中,则后指针是安全的。当房间
被摧毁时,人
也会被摧毁(轰!),所以不会出什么差错
但我怀疑这太简单了。Room
的声明更可能类似于:
class Room {
std::vector<std::shared_ptr<Person>> peopleInside;
};
并从一些共享的
文件中初始化currentRoom
,当文件室存在时,您可以使用这些文件。这打破了循环依赖关系
要取消对currentRoom的引用,您可以执行以下操作:
if (auto room_I_am_currently_in = currentRoom.lock())
{
room_I_am_currently_in->OpenDoor ();
}
如果原始的shared_ptr
已被解除,则lock
将失败。当room\u I\u am\u current\u in
超出范围(它实际上是一个共享的ptr
)时,锁将被释放
要将一个人移动到另一个房间,只需重新分配currentRoom
更多关于std::weak_ptr
at.如果人们经常在房间之间走动,我认为向量可能是一个不好的选择。我不喜欢的是这种设计会给出不一致的状态,即a房间的人可能会指向B房间。但为了评估这是否可以避免,有必要进行一些用例描述,即对数据执行何种操作?例如,我想象一个操作是将人X移动到房间A,对吗?那么你是如何找到那个人的呢?要搜索的名称?你是如何获得房间A的?你有房间向量吗?是的,我同意这两种观点-存储直接对象会导致太多的复制,并且可能出现不一致的状态。我有一个房间的图表和它们之间的过渡。一个人可能会移动到相邻的房间,如果有一个过渡,移动是一个动作(如在游戏中),游戏逻辑将更新集合,使它们同步。。。但我自己也看到了这种设计的弱点……你能描述一下为什么人们需要了解这个房间吗?从您评论中的描述来看,似乎您的管理员已经知道涉及哪些房间了。@4386427这样可能比较方便。否则,如果你手头只有一个人
,你就必须询问你的房间的容器
(不管是什么),以找到该人目前在哪个房间
,这将涉及某种搜索。
if (auto room_I_am_currently_in = currentRoom.lock())
{
room_I_am_currently_in->OpenDoor ();
}