2016-10-25 20 views
1

を取得します。は私がvoidポインタを使用して、私の列挙は異なる値を取得しようとしている個別の列挙値C++

私は動物のリストの列挙型の宣言に

enum Animal {Rat, Ox, Tiger, Rabbit, Dragon, Snake, Horse, Sheep, Monkey, Rooster, Dog, Pig}; 

をしましたので、まず、私は私の建設中に続いて私に私の列挙からランダムに

VoidPtr getAnAnimal() 
{ 
    VoidPtr anAnimal; 

    Animal *a = new Animal; 

    int k = rand() % 12; 

    *a = static_cast<Animal>(k); 

    anAnimal = a; 

    return anAnimal; 
} 

値を返す関数を持っている

配列は、配列が同じ値を持っているかどうかを示す条件付きのステートメントがあり、別の列挙型値をランダムに生成すると仮定します。

void constructSet(VoidPtr* animalArray, int size) 
{ 

    for(int i = 0; i < size; i++) 
    { 
     animalArray[i] = getAnAnimal(); 

     int k = 0; 

     while ((k < i) && (animalArray[i] == animalArray[k])) 
     {  
      animalArray[i] = getAnAnimal(); 

      k++; 
     }   
    } 

} 

残念ながら、配列が同じ場合は別の値を呼び出しても、同じ列挙型の値を返します。

+4

一つの目的に整数をキャストすることはできません - あなたはおそらく、あなたの '列挙型に基づいて、工場の機能を使用したい – UKMonkey

+1

あなたも削除されずに失われ、新たな動物(A)として、ここでメモリリークを持っているでしょう'。キャスティングが必要になることがあります。また、 'VoidPtr'の代わりに' Animal * 'を使います。 –

+0

私はあなたが何をしようとしていることは、動物の工場作りだと思う - あなたが作るしようとしている場合 – UKMonkey

答えて

3

あなたのエラーがanimalArray[i]==animalArray[k]を比較するとき、あなたが列挙型のアドレスではない彼らの値を比較することです。適切な比較は

*static_cast<Animal*>(animalArray[i])==*static_cast<Animal*>(animalArray[k]) 

(明らかにこれはクリーンなコードがどのように見えるかではなく、間違いが void*として enumを渡すことにあり、コメントの後に編集)だろうただし、ポインタとしてご Animalを格納再考すべきです。 C++では、通常はオブジェクトを newで割り当てる理由はありません(本当に必要な場合を除き、C++でポインタを扱う必要はありません)。あなたのような単純な問題ではない。 constructSet

+0

私がポインタ配列を逆参照しようとすると、 'voidはポインタからオブジェクトへの型ではありません.' –

+1

あなたは正しいです。また、 'animalArray [i]'を 'Animal *' - **にキャストする必要がありますが、 'enum'値をポインタとして渡すという設計思想はすべて壊れています!** – chtz

-1

あなたのアルゴリズムは、本当にあなたの記述に対応していません。 I配列は同じ 値を持っている場合は述べて条件文をした、それがランダムに別の列挙型の値

を生成すると仮定された2つの命令animalArray[i] = getAnimal();k++は別の枝にする必要があり

一つの条件。 animalArray[i]animalArray[k]と異なる場合は、k++を反復する必要があります。たとえば、*animalArray[i] != *animalArray[0]ではなく、*animalArray[i] == *animalArray[1]という配列が同じ値を持っていても挿入するとします。

またk新しい動物が挿入されるたびに再初期化されなければなりません。ここで

が可能な代替アルゴリズムです。私はコンパイルエラーをチェックしていない。

void constructSet(VoidPtr* animalArray, int size) 
{ 
    int attempt = 0; 
    for(int i = 0; i < size; i++) 
    { 
     animalArray[i] = getAnAnimal(); 
     int k = 0; 
     while ((k < i) && (*reinterpret_cast<const Animal*>(animalArray[i]) != *reinterpret_cast<const Animal*>(animalArray[k]))) 
      k++; 
     if (k < i && attempt < 12) { // retry? 
      --i; 
      ++attempt; 
     } 
     else // accept the animal 
      attempt = 0; 
    } 
} 
関連する問題