我很久没有使用过C ++了。我试图显示一些多态行为:
class func {
public:
virtual void print() = 0;
};
class func1 : public func {
public:
void print () { cout << "FUNC 1" << endl; };
};
class func2 : public func {
public:
void print () { cout << "FUNC 2" << endl; };
};
static map<string,func *> myMap;
static func1 f1 = func1 ();
static func2 f2 = func2 ();
myMap["func1"] = &f1;
myMap["func2"] = &f2;
所以在我的主要功能中,当我打电话时:
myMap["func1"]->print();
myMap["func2"]->print();
我希望:
FUNC 1
FUNC 2
不确定这是否是正确的方法。当我编译代码时,它给了我这个错误:
test.cc:31: error: expected constructor, destructor, or type conversion before ‘=’ token
test.cc:32: error: expected constructor, destructor, or type conversion before ‘=’ token
这是指这些行:
myMap["func1"] = &f1;
myMap["func2"] = &f2;
谢谢。
答案 0 :(得分:3)
表达式语句,就像那些赋值语句一样,只能进入函数内部。
在C ++ 11中,您可以使用大括号初始化初始化静态映射:
static map<string,func *> myMap = {
{"func1", &f1},
{"func2", &f2}
};
如果你遇到过去,那么要么在函数中填充它(可能是main
,或者在对地图做任何事情之前调用的东西),或者写一个函数来返回填充的地图: / p>
std::map<string,func*> make_map() {
std::map<string,func*> map;
map["func1"] = &f1;
map["func2"] = &f2;
return map;
}
static std::map<string,func *> myMap = make_map();
如果可能的话,更好的想法可能是避免非平凡的全局变量;他们经常带来痛苦的世界。