如何将'this'作为参数传递给另一个没有循环依赖的类构造函数?

Mat*_*ips 5 c++ dependencies include strategy-pattern

我正在考虑策略模式(Design Patterns,GoF94),其中建议传递给策略构造函数的上下文可以是包含策略(作为成员)本身的对象.但以下方法不起作用:

//analysis.h

class StrategyBase;
class Strategy1;
class Strategy2;
class Analysis
{
   ...
      void ChooseStrategy();
   private:
      StrategyBase* _s;
      ...
};

//analysis.cpp

void Analysis::ChooseStrategy()
{
   if (...) _s = new Strategy1(this);
   else if (...) _s = new Strategy2(this);
   ...
}

//strategy.h

#include analysis.h
...
Run Code Online (Sandbox Code Playgroud)

然后StrategyBase及其子类访问Analysis的数据成员.

这不起作用,因为您无法在定义之前实例化Strategy*类.但它的定义取决于分析的定义.那么你应该怎么做呢?将ChooseStrategy替换为

void SetStrategy(StrategyBase* s) { _s = s; }
Run Code Online (Sandbox Code Playgroud)

并在#include analysis.h和strategy.h的文件中进行实例化?这里最好的做法是什么?

Mar*_*utz 6

除了非常一般的状态/策略之外,您将始终在状态/策略模式中具有循环依赖关系.但是你可以限制相应的其他类的in-size(Lakos)使用,以便它至少编译:

  1. 前向声明Analysis(analysis.hstrategies.h)
  2. 定义StrategyBase和子类(不要使用的内联方法Analysis)(strategies.h)
  3. 定义Analysis(可能已经使用了使用策略的内联方法)(analysis.h)
  4. 实现Analysis和策略类的非内联方法(analysis.cpp)


Mar*_*k B 3

analysis.cpp还需要包括strategy.h获取策略的完整定义。由于它是源文件,因此不存在循环依赖关系。