c++ - C++ 中的循环依赖

标签 c++ design-patterns circular-dependency

事实:

  • 我有两个主要类别:经理和专家。
  • 有几种不同类型的专家。
  • 专家通常需要其他专家的帮助才能完成工作。
  • 经理认识所有的专家,最初每个专家只认识他们的经理。 (这就是问题所在。)
  • 在运行时,管理器会创建并存储专家列表。然后 Manager 遍历列表并要求每个专家进行初始化。在初始化期间,每个专家都要求经理向他们提供满足某些描述的其他专家。完成后,经理将进入一个循环,在此期间专家被依次要求执行他们的专业任务。

对我来说,这似乎是一个不错的模式,但由于经理有专家列表,而专家有经理,我遇到了循环依赖问题。

在这种情况下,我应该以某种方式向前声明一个类的存在吗? (如果是这样,如何?)或者我应该使用一些设计模式来解决这个问题? (如果是这样呢?)另外......我虽然模式本身很不错。所以我不介意有人帮助我理解为什么这是一件坏事。

最佳答案

在这两种情况下,前向声明另一个类:

Manager.h

class Specialist;

class Manager
{
    std::list<Specialist*> m_specialists;
};

Specialist.h

class Manager;

class Specialist
{
    Manager* m_myManager;
};

只有当你需要在该类中使用成员函数或变量,或者需要将类用作值类型等时,才需要为类引入头文件。当你只需要一个指针时或引用类,前向声明就足够了。

请注意,前向声明不仅仅用于解决循环依赖。您应该尽可能使用前向声明。如果可行的话,它们总是比包含一个额外的头文件更可取。

关于c++ - C++ 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4018816/

相关文章:

c++ - 在单线程或单独线程中接收/发送?

design-patterns - C# 设计模式建议

java - 由于在 REST 中使用 HATEOAS 而导致循环依赖

angular - 构建服务的正确方法是什么?

c++ - 我无法按类型访问使用 forward_as_tuple 创建的元组中的元素

c++ - 使用全局对象时会崩溃,但使用本地对象时不会崩溃

c++ - write_some 与 write - boost asio

java - 在 Eclipse 中为每个类创建单独的 java 文件是一个好的做法吗?

c# - 关于依赖注入(inject),何时使用抽象类与接口(interface)?

c++ - 循环依赖/不完整类型