JnB*_*ymn 18 c++ design-patterns circular-dependency
事实:
对我而言,这似乎是一个不错的模式,但由于经理有一个专家列表,而专家有一个经理我得到循环依赖问题.
这是一个我应该以某种方式向前宣布一个类存在于另一个类的情况吗?(如果是这样,怎么样?)或者我应该使用一些设计模式来解决这个问题?(如果是这样的话?)另外......我虽然模式本身还不错,所以我不介意有人帮助我理解为什么这是一件坏事.
Pet*_*der 25
在这两种情况下,forward都声明另一个类:
Manager.h
class Specialist;
class Manager
{
std::list<Specialist*> m_specialists;
};
Run Code Online (Sandbox Code Playgroud)
Specialist.h
class Manager;
class Specialist
{
Manager* m_myManager;
};
Run Code Online (Sandbox Code Playgroud)
您需要为类引入头文件的唯一时间是您需要在该类中使用成员函数或变量,或者需要将该类用作值类型等.当您只需要指针或引用时一个班级,一个前瞻性声明就足够了.
请注意,前向声明不仅仅用于解决循环依赖性.您应该尽可能使用前向声明.如果它们完全可行,它们总是更好地包括额外的头文件.
Fli*_*sch 10
这是一个品味问题,但前向声明通常是包含在头文件中的一个很好的替代品,即使没有循环依赖.(我不想在这个地方就此进行讨论.)所以,这里有一个关于如何为你的问题应用前向声明的例子:
在Manager.h中:
// Forward declaration:
class Specialist;
// Class declaration:
class Manager
{
// Manager declarations go here.
// Only pointers or references to
// the Specialist class are used.
};
Run Code Online (Sandbox Code Playgroud)
在Manager.cpp中:
#include "Specialist.h"
// Manager definitions/implementations
// using the Specialist class go here.
// Full Specialist functionality can be used.
Run Code Online (Sandbox Code Playgroud)
在Specialist.h中:
// Forward declaration:
class Manager;
// Class declaration:
class Specialist
{
// Specialist declarations go here.
// Only pointers or references to
// the Manager class are used.
};
Run Code Online (Sandbox Code Playgroud)
在Specialist.cpp中:
#include "Manager.h"
// Specialist definitions/implementations
// using the Manager class go here.
// Full Manager functionality can be used.
Run Code Online (Sandbox Code Playgroud)