1
class OSwitch {
private:
    Operator *operators[];
    //int variable; <-- unused variable

public:
    OSwitch() {}
    ~OSwitch() {}

void setOperator(int id, Operator *op) {
    operators[id] = op;
}

void execute(int id) {
    operators[id]->execute();
}

};

抽象基本クラス Operator のサブクラスがいくつかあります。setOperator() を複数回呼び出すと、配列は最後の要素を「忘れ」ます。

例えば

XOperator a;
YOperator b;
os.setOperator(1,a);
os.setOperator(2,b);
os.execute(1); // <- wont work

しかし、int 変数 (または OperatorSwitch の他の変数) が宣言されている場合は機能します。これがどのように機能するかわかりません。

ヒントをありがとう。

4

3 に答える 3

1

配列operatorsのサイズが宣言されていません。のように配列内の要素数を宣言するか、代わりにoperators[10]使用std::vectorします。

于 2012-05-20T18:46:46.260 に答える
1

メンバー変数operatorsはサイズのない配列です。これは不完全な型であり、クラス定義では許可されていません。

おそらく代わりに必要なのは、整数からポインターへのマップです。

#include <map>

class OSwitch
{
private:
    std::map<int, Operator *> operators;
public:
    void setOperator(int id, Operator *op) { operators[id] = op; }
    void execute(int id) { operators[id]->execute(); }
};

execute有効なポインタが割り当てられていない IDを呼び出すとエラーになることに注意してください。最初にマップ要素の存在を確認することで、これをより堅牢にすることができます。

于 2012-05-20T18:56:23.000 に答える
0

データを追加する前に配列を初期化する必要があります。この配列では、ポインターではなく値を使用することをお勧めします。そうすれば、後で s を削除するユーザー(つまり、 orOperator*の呼び出し元) を定義する際に問題が発生しないからです。setOperator~OSwitch()

于 2012-05-20T18:51:45.717 に答える