STL карта и чистый виртуальный базовый класс

Я не использовал 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

Решение

Операторы выражений, как и эти операторы присваивания, могут идти только внутри функций.

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

Лучшей идеей может быть, по возможности, избегание нетривиальных глобальных переменных; они часто приносят мир боли.

3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector