我正在尝试使用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++;
}
}
}
不幸的是,尽管在数组相同的情况下调用另一个值,它仍会返回相同的枚举值。
答案 0 :(得分:3)
您的错误是,在比较animalArray[i]==animalArray[k]
时,您比较枚举的地址而不是它们的值。正确的比较是(评论后编辑,显然这不是干净的代码看起来像,但错误在于将enum
作为void*
传递
*static_cast<Animal*>(animalArray[i])==*static_cast<Animal*>(animalArray[k])
但是,您应该重新考虑将Animal
存储为指针。
在C ++中,通常没有理由按new
分配对象(除非你真的需要,否则你不需要使用C ++中的指针)。至少不是因为你的简单问题。
答案 1 :(得分:-1)
constructSet
中的算法与您的描述并不完全对应。
我是一个条件语句,表明数组是否相同 值,假设随机生成另一个枚举值
两条指令animalArray[i] = getAnimal();
和k++
应位于条件的不同分支中。当k++
与animalArray[i]
不同时,animalArray[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;
}
}