0

私は長い間 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;

ありがとうございました。

4

1 に答える 1

3

これらの代入ステートメントと同様に、式ステートメントは関数内にのみ入れることができます。

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

可能であれば、重要なグローバル変数を避けることをお勧めします。彼らはしばしば痛みの世界をもたらします。

于 2014-07-28T17:09:16.930 に答える