Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环依赖关系;包括「;及;在“中”;_C++_Architecture_Software Design - Fatal编程技术网

C++ 循环依赖关系;包括「;及;在“中”;

C++ 循环依赖关系;包括「;及;在“中”;,c++,architecture,software-design,C++,Architecture,Software Design,我想就以下问题征求你的意见 我们有一门课叫“房间”。每个文件室可能包含零个或多个“Person”类实例,因此该文件室存储一组人员(例如vector)。它拥有它们。但是,在房间之间移动人员有一些耗时的逻辑,因此人员还包含他们所在的当前房间。它只是一个没有所有权的指针。这个信息在理论上是多余的,因为人们可以从房间里的人的集合中得到它,但是假设房间数量很大>>人的数量,这样的操作会很慢 class Room { std::vector<Person> peopleInside; }; c

我想就以下问题征求你的意见

我们有一门课叫“房间”。每个文件室可能包含零个或多个“Person”类实例,因此该文件室存储一组人员(例如vector)。它拥有它们。但是,在房间之间移动人员有一些耗时的逻辑,因此人员还包含他们所在的当前房间。它只是一个没有所有权的指针。这个信息在理论上是多余的,因为人们可以从房间里的人的集合中得到它,但是假设房间数量很大>>人的数量,这样的操作会很慢

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 ();
}