3

ちょっとした問題です。「セル」と呼ばれるクラス内に、「例」という列挙型があります

  typedef enum Example
  {
      E1=0,
      E2,
      E3,
      E4
  };
  Example inputValueE;

また、次のようにクラス内に関数があります

  void evolveE(Example type_);

クラスの外では、次のようにいくつかの型の関数を定義しようとしています

void cell::evolveE(Example type_ = E1){****some stuff****;};
void cell::evolveE(Example type_ = E2){****some diff stuff****;}; ***etc***

私はこれらを少しいじってみましたが、うまくいきませんでした。問題は、同じ関数を再定義できないことです。これを行うためのよりエレガントな方法があると確信していますが、常にバックアップである switch-case type コマンドを使用するつもりでした

どんな助けでも大歓迎です。

4

3 に答える 3

1

このステートメントの場合:

void cell::evolveE(Example type_ = E1);

2つのポイント:

  1. ここでは、のパラメータのデフォルト値を設定しており、次evolveEのタイプを使用しないようにしています。enum
  2. あらゆる種類の値に基づいて関数をオーバーロードすることはできません。関数は、異なるタイプと数のパラメーターでのみオーバーロードできます

解決策の1つ:

すべての値を独立したタイプにするために使用することを選択できます。

enum E1 {};
enum E2 {};
enum E3 {};
于 2011-07-31T05:23:04.293 に答える
1

その構文は、デフォルトの引数を設定します。呼び出し元から渡された実際のパラメーターと一致しません。switch/を使用しcaseます。

派手にしたい場合は、関数ポインターの配列 (またはマップ) を使用することもできます。

于 2011-07-31T04:08:15.640 に答える
0

関数をオーバーロードする (クラス内で同じ名前の関数を複数提供する) 場合、次のように各関数に異なる引数の型のセットを提供する必要があります。

void cell::evolveE(Example type_){****some stuff****;}
void cell::evolveE(OtherExample size_){****some diff stuff****;}

Exampleここで、1 つの関数が type の引数を取り、もう 1 つの関数が type の引数を取ることに注意してくださいOtherExample。オーバーロードしようとしている関数に異なるデフォルト値を指定しても、両方の関数が同じ引数のを取るため、コンパイラはそれらの違いを判断できません。

スイッチを使用することもできますが、バグが発生しにくいため、if/else をお勧めします。

Example列挙型が実際にクラスのタイプを決定している場合は、ポリモーフィズムを使用できます。これは、OOP の非常に洗練された機能です。次に、次のようなものがあります。

class cell
{
    ...
    virtual void evolveE() = 0;
};

class E1cell : public cell
{
    ...
    void evolveE()
    {
        // some stuff
    }
};

class E2cell : public cell
{
    ...
    void evolveE()
    {
        // some diff stuff
    }
};
于 2011-07-31T04:27:10.373 に答える