簡體   English   中英

獲取不同的枚舉值C ++

[英]Getting distinct enum values C++

我正在嘗試使用void指針從枚舉中獲得獨特的價值。

我有一個動物清單的枚舉聲明

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++;
       }        
   }

}

不幸的是,即使數組相同也需要另一個值,它仍然返回相同的枚舉值。

您的錯誤是,當比較animalArray[i]==animalArray[k]您將比較枚舉的地址而不是其值。 適當的比較將是(在注釋后編輯,顯然這不是干凈的代碼,但是錯誤在於將enum作為void*傳遞)

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

但是,您應該重新考慮將Animal存儲為指針。 在C ++中,通常沒有理由通過new分配對象(除非確實需要,否則您也不需要在C ++中使用指針)。 至少不是像您這樣的簡單問題。

您在constructSet中的算法實際上與您的描述不符。

我有一個條件語句,聲明該數組是否具有相同的值,假設隨機生成另一個枚舉值

兩條指令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;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM