2016-10-25 3 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

당신이하려고하는 것은 동물 공장을 만드는 것이라고 생각합니다 - getAnimal (AnimalTypeEnum)을 호출하는 곳 ... 팩터 리 패턴이라고합니다 ... grr - @ πάνταῥε by에 의해 펀치에 맞 춥니 다 – UKMonkey

답변

3

animalArray[i]==animalArray[k]을 비교할 때 해당 값이 아닌 열거 형 주소를 비교하면 오류가 발생합니다. 적절한 비교는 (분명히이 깨끗한 코드가 어떻게 생겼는지 아니라, 코멘트 후 편집 할 수 있지만 실수는 void*enum 전달에있다) 될 것이다 당신이 포인터와 같은 Animal를 저장 재고해야,

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

그러나. C++에서 일반적으로 new으로 개체를 할당 할 이유가 없습니다 (실제로 필요하지 않으면 C++에서 포인터로 작업 할 필요가 없습니다). 최소한 단순한 문제는 아닙니다.

+0

내 포인터 배열을 역 참조하려고 할 때'void가 포인터와 오브젝트 유형이 아님' –

+1

맞습니다. 'animalArray [i]'를'Animal *'- **으로 형변환해야하지만,'enum' 값을 포인터로 전달한다는 디자인 아이디어는 깨졌습니다! ** – chtz

-1

constructSet에있는 귀하의 알고리즘은 실제로 귀하의 설명과 일치하지 않습니다.

나는 배열이 같은 값이있는 경우, 무작위로 다른 지점에 있어야 또 다른 열거 값을

두 지침 animalArray[i] = getAnimal();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; 
    } 
} 
관련 문제