首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

effective c++条款35中的有关问题

2012-09-29 
effective c++条款35中的问题在藉由Function Poiter实现strategy模式中,他给出这么一个例子:class GameCha

effective c++条款35中的问题
在藉由Function Poiter实现strategy模式中,他给出这么一个例子:
class GameCharacter; // 前置声明
 
// defaultHealthCalc函数:计算生命值的默认算法
int defaultHealthCalc(const GameCharacter& gc);
 
class GameCharacter {
public:
  typedef int (*HealthCalcFunc)(const GameCharacter&);
 
  explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
  : healthFunc(hcf)
  {}
 
  int healthValue() const
  { return healthFunc(*this); }
  ...
private:
  HealthCalcFunc healthFunc;
}

对应的派生类为:
class EvilBadGuy: public GameCharacter {
public:
  explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
  : GameCharacter(hcf)
  { ... }
  ...
};
int loseHealthQuickly(const GameCharacter&); // 不同计算方式的
int loseHealthSlowly(const GameCharacter&); // 生命值计算函数
 
EvilBadGuy ebg1(loseHealthQuickly); // 同一类型的角色
EvilBadGuy ebg2(loseHealthSlowly); // 使用不同类型的
  // 生命值计算方法

我的问题是:基类和派生类的构造函数形参是HealthCalcFunc类型的函数指针,而这个函数指针的参数又是一个基类的引用。这样的实现似乎不太可能啊?因为这个函数指针的实参没办法获得。我构造GameCharacter 或者EvilBadGuy对象的时候,却需要一个这个类型的对象来调用函数指针。
不知道我的理解是不是有问题?

[解决办法]
构造GameCharacter 对象的时候并不需要调用函数指针
[解决办法]
因为这个函数指针的实参没办法获得?
构造函数里传入一个函数指针 只是给那个函数指针成员赋值罢了。
此时并没有调用health的计算函数

真正调用是在构造函数完成以后 
这时候的对象已经构造完成
可以作为一个参数
为什么不太可能?

热点排行