0

設計上の問題があります:

次のようないくつかのコマンドに対して、次の整数のセットがあります。

addition = {2,3,4,5}
subtraction = {3,6,9}

ここで、add の優先順位は > sub の優先順位です。

だから私は次のようなクラスを作成しました

class Command{
    int priority;
    public:
    bool operator <(const Command &com);
    bool isInSet(int); 
    // i donot want this to be int , 
    // may be tommorrow i go for strings or char.
    // How to do this. AND
    void execute(int); // should it be here?
};

これらのコマンドはデータ構造で動作するため。

すべてのコマンドが自分自身を実行する方法を知っている必要があります。つまり、コマンド自体の中に関数が必要です。

execute() がコマンド内にある場合、データ構造にどのようにアクセスしますか? そのため、Command にもこの DS へのポインターが必要です。

またはペアにする必要がありますが、クラスの実行にはDSへのポインターが必要になります。

または、コマンドがいくつかの列挙型を送信し、それを切り替えて次のようなことを行うようにする必要があります

    enum {PUSH, POP};

while(!commands[i].isInSet(3))
    ++i;

switch(comands[i].getName())
{
    case PUSH:
            // operations on DS i have all of them in this scope. :)
    case POP:
            ...
}

私は何をすべきか ?

他に良い方法はありますか?ありがとう。

4

1 に答える 1

1

私はあなたの質問をうまく理解しているかどうかわかりませんが、

すべてのコマンドが自分自身を実行する方法を知っている必要があります。つまり、コマンド自体の中に関数が必要です。

私はイエスと思う。コマンドのロジックをクラスのメソッドとして含めます。別の構造を使用したいので、データ型のインターフェイスとして機能する抽象基本クラスを作成します。コマンドは、基本クラスへのポインターを受け入れ、インターフェイスを使用してその操作を実行します。

execute() がコマンド内にある場合、データ構造にどのようにアクセスしますか? そのため、Command にもこの DS へのポインターが必要です。

はい、これで全然大丈夫だと思います。

または、コマンドがいくつかの列挙型を送信し、それを切り替えて次のようなことを行うようにする必要があります

多くの場所でスイッチを入れる場合は、避けるべきだと思います。1 か所だけであれば、問題ないかもしれません。しかし、一般的に言えば、新しい型を追加するのが難しくなるため、このアプローチは避けます。スイッチを 1 つ忘れて、何時間もデバッグします。

于 2012-12-17T08:49:23.920 に答える