【问题标题】:STL map and pure virtual base classSTL 映射和纯虚拟基类
【发布时间】:2014-07-28 17:03:58
【问题描述】:

很久没用过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;

谢谢。

【问题讨论】:

  • 这些语句myMap["func1"] = &amp;f1;myMap["func2"] = &amp;f2;是否出现在函数定义体之外?
  • @πάνταῥεῖ 他们很可能是。
  • 是的。我明白了,现在我的代码可以编译了。为什么它们必须在函数定义中?
  • static func1 f1 = func1 (); 应该是static func1 f1;
  • @NeilKirk static func1 f1 = func1 (); 不是合法的 C++ 代码吗?

标签: c++ stl virtual abstract-base-class


【解决方案1】:

表达式语句和赋值语句一样,只能放在函数内部。

在 C++11 中,您可以使用大括号初始化来初始化静态映射:

static map<string,func *> myMap = {
    {"func1", &f1},
    {"func2", &f2}
};

如果你被困在过去,那么要么将它填充到一个函数中(可能是main,或者你在对地图做任何事情之前调用的东西),或者编写一个函数来返回一个填充的地图:

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();

如果可能的话,一个更好的主意可能是避免非平凡的全局变量;他们经常带来痛苦的世界。

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多