2013-04-25 2 views
0

대학 과정에 대한 과제를 수행하고 있으며 나와 파트너에게 문제가 있습니다. 우리가 만들고있는 프로그램은 게임입니다.부모 클래스를 사용하는 동안 하위 기능에 액세스

우리는 모든 클래스가 Creature라는 기본 클래스에서 상속받습니다. 이들은 플레이어가 처리해야하는 모든 적이며 그들 모두는 자신의 AI를 실행합니다. 네임 스페이스 Creature (부모, Creature 포함) 내에 네 가지 유형의 하위 클래스가 있으며, 하나의 클래스에는 필요한 특수 기능 만 있습니다. 이 클래스는 Bunny라고합니다.

이제 제 일은 필요에 따라 AI 기능을 호출하는 것입니다. 문제는, 나는 항상 모른다. 무엇이 클래스이다. 게임 보드에게 내가 얻은 생물이 무엇인지를 물어볼 때.

모든 원수는 게임 보드 사각형에서, 그래서 같은 포인터로 저장됩니다 : 우리는 특별한 기능에 액세스해야 할 때까지

struct Square 
    { 
     // Pointers to Morso class, where the enemy is saved 
     Creature::Creature* creature; 
     //Undeeded stuff removed 

    }; 

지금,이 모든 미세이다. Pupu는 특정 조건이 충족되면 증식합니다. 따라서 Pupu에서는 제대로 작동하는지 확인하기 위해 필요한 몇 가지 기능이 있습니다.

그러나 여기에 문제가 있습니다.

저는 보드 클래스를 호출하여 제가 제시 한 좌표에있는 생물을 알려줍니다. 이제

void GameEngine::GameEngine::runAI() 
{ 
    Creature::Creature* creature= NULL; 

    for(unsigned int y = 0; y < dimY; y++) 
    { 
     for(unsigned int x = 0; x < dimX; x++) 
     { 
      Coordinate target; 

      target.setX(x); 
      target.setY(y); 

      creature= board_->returnCreature(target); 

      //If there is a creature in the target, run its AI 
      if(creature!= NULL) 
      { 

       //If it is, check special procedures 
       if(creature->returnType() == "bunny") 
       { 
        bunnyReproduce(creature); 
       } 

       creature->ai(); 
      } 

     }//for x 

    }//for y 
} 

:

void GameEngine::GameEngine::bunnyReproduce(Ccreature::Creature* creature) 
{ 

//Checks that it really is a bunny 
if(creature->returnType() != "bunny"){ return; } 

//Check is there another bunny near 
creature->checkForMate(); 


} 

문제는, 생물,이 시점에서, 공공 버니의 멤버가 아닌 생물이다 checkForMate을 위해 호출 할 수있다. 우리가 가상 기능을 Creature에 만들어야합니까?

checkForMate를 Creature :: Bunny에 넣으려고했으나 원래 값으로 부여하려고 했으므로 Creature 클래스가 아닙니다. 그렇게 할 수 없습니다. Creature 클래스에 빈 가상 함수를 만들고 Bunnyclass를 오버라이드 (override)해야합니까?

Qt 5.0.2와 함께 Qt Creator 2.7.0을 실행 중입니다.

+0

출처의 주석과 식별자는 일반적으로 일반 영어 여야합니다. 조만간 소스 *가 "국제"(예 : 여기)와 같기 때문입니다. – DevSolar

+0

음, 이름을 빨리 바꿀 수 있기 때문에 읽기가 더 쉬워야합니다. 그냥 확인 – Mandemon

답변

3

당신은 virtual 기능을 reproduceCreature에 클래스를 추가하고 구현을 Bunny 또는 다른 생물은 나중에 게임에 추가 할 수 있습니다. 그래서 어떤 생물이라도 그 자신의 방식으로 스스로를 재현 할 것입니다. 이 경우 생물 유형을 확인할 필요조차 없습니다. 재현 할 수없는 생물이 있다면 아무 것도하지 않을 빈 방법으로 reproduce을 구현하면됩니다.

+1

이것은 우리가 지금 가지고있는 방법입니다.그것은 (적어도 보인다) 작동합니다. 우리가 확신하면 나는이 대답을 받아 들일 것입니다. 지금 우리의 토끼는 실제로 재현 할 기회를 얻지 못합니다. 어떤 이유에서인지 판다 스는 토끼의 육질에 대한 취향을 개발했습니다 ... – Mandemon

+1

우리가 지금 갈 방법이기 때문에 나는이 대답을 받아들입니다. molbdnilo 제안이 좋지만, 코드에서 특정 큰 재 작성이 (아직) 준비가되어 있지 않아야합니다. 어쩌면 그것이 작동 한 후에, 우리는 최적화를 시작할 수 있습니다. – Mandemon

0

이상적으로는 엔진이 어떤 종류의 크리처와 상관하지 않아도됩니다.

토끼를 각 ai() 단계에서 재생산하고 싶다면 토끼의 ai()에 넣지 않으시겠습니까?
어쨌든 전능 한 외장 엔진보다는 재현시기를 결정하는 것이 토끼의 책임이 아니겠습니까?

void Creature::Bunny::ai() 
{ 
    if (niceMateNearby()) 
     reproduce(); 
    else 
     eatCarrotsAndJumpAround(); 
} 
+0

그렇지 않으면 동의하지만, 엔진은 생물을 추적하는 데 필요하며, 새 토끼가 태어 났을 때 엔진은 그것에 대해 알아야합니다. 프로그램이 재설정되거나 종료되면 엔진은 새로운 명령으로 예약 한 메모리를 해제합니다. – Mandemon

+0

@Mandemon 새 토끼가 엔진을 만들지 않고 엔진이 존재 함을 엔진에 알릴 이유가 없습니다. – molbdnilo

+0

그래서 ... 어떻게해야합니까? 엔진의 포인터를 새로운 토끼에게 보냄으로써 그것이 태어났다는 것을 엔진에 알릴 수 있습니까? – Mandemon

관련 문제