[英]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.