class FunctionBase {
public:
const double operator() (double a_) const = 0;
}
class AddN : public FunctionBase {
public:
AddN (int n_) : FunctionBase(), _n(n_) {}
const double operator() (double a_) const { return (a_ + n); }
private:
int _n;
}
我是否必须使用FunctionBase *
作为占位符,因为编译器无法从AddN
重建FunctionBase
,或者有没有办法使用FunctionBase &
}?
- 编辑 -
我有std::map<std::string, FunctionBase *>
,如果我能够使用引用而不是指针,我很好奇,所以我可以保证指针在使用之前不是NULL。我正在尝试使代码更具抗错性。如果我将它切换到FunctionBase &
,编译器会抱怨它无法从AddN
实例化FunctionBase &
这是完全合理的,但是我希望有一个我不知道的常见解决方法。
答案 0 :(得分:1)
使用std::function
或boost::function
而不是定义类层次结构建议。这些可以保存一个可调用的,可以存储在map
中的值,保证函数对象的生命周期:
std::map<std::string, std::function<double(double)>> functions;
这消除了使用类层次结构的需要,并且不需要添加到地图中的函数无论如何都相关,这更灵活。
只是要指出使用引用而不是指针并不能保证被引用的对象仍然存在。悬挂引用是可能的,就像悬空指针一样。