我正在特别考虑策略模式(设计模式,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
...
然后 StrategyBase 及其子类访问 Analysis 的数据成员。
这是行不通的,因为您无法在定义之前实例化 Strategy* 类。但它的定义取决于分析的定义。那么你应该怎么做呢?将选择策略替换为
void SetStrategy(StrategyBase* s) { _s = s; }
并在#include analysis.h和strategy.h的文件中进行实例化?这里的最佳做法是什么?