获得不同的枚举值C ++

时间:2016-10-25 16:07:58

标签: c++ enums

我正在尝试使用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++;
       }        
   }

}

不幸的是,尽管在数组相同的情况下调用另一个值,它仍会返回相同的枚举值。

2 个答案:

答案 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;
   }
}