2016-04-14 1 views
1

Я должен заполнить свои grid кроликами, белками, волками и гепардами. Я ищу отображение строки в тип объектаКарта «RABBIT» для вызова нового «RABBIT»()

populate("CHEETAH", 2); 
populate("WOLF", 3); 
populate("SQUIRREL", 10); 
populate("RABBIT", 10); 

На данный момент у меня есть этот повторяющийся код, который я хотел бы избавиться.

CELL grid[GRIDHEIGHT][GRIDWIDTH]; 

void populate() 
{ 
    int num_rabbits = 0, num_squirrels = 0, num_wolves = 0, num_cheetahs = 0; 
    int random, randX, randY; 
    srand((int)time(NULL)); 

    while (num_rabbits < 10) 
    { 
     randX = rand() % GRIDHEIGHT; 
     randY = rand() % GRIDWIDTH; 

     if (!(grid[randX][randY].Has_An_Animal())) 
     { 
      grid[randX][randY].animal = new RABBIT(); 
      num_rabbits++; 
     } 
    } 

    while (num_squirrels < 10) 
    { 
     randX = rand() % GRIDHEIGHT; 
     randY = rand() % GRIDWIDTH; 

     if (!(grid[randX][randY].Has_An_Animal())) 
     { 
      grid[randX][randY].animal = new SQUIRREL(); 
      num_squirrels++; 
     } 
    } 

    while (num_wolves < 3) 
    { 
     randX = rand() % GRIDHEIGHT; 
     randY = rand() % GRIDWIDTH; 

     if (!(grid[randX][randY].Has_An_Animal())) 
     { 
      grid[randX][randY].animal = new WOLF(); 
      num_wolves++; 
     } 
    } 

    while (num_cheetahs < 2) 
    { 
     randX = rand() % GRIDHEIGHT; 
     randY = rand() % GRIDWIDTH; 

     if (!(grid[randX][randY].Has_An_Animal())) 
     { 
      grid[randX][randY].animal = new CHEETAH(); 
      num_cheetahs++; 
     } 
    } 
}//end 
+0

Для уточнения, вы хотите создать функцию Заселите создает объекты типа, используемого в качестве параметра? – Stephen

+0

Да, извините за отсутствие деталей. заполнить («RABBIT», 2), следует создать 2 RABBIT. На самом деле, я просто ищу способ скомпенсировать этот код изящно, используя некоторое сопоставление строки с объектом. – user3487243

+0

Нужно ли это «заполнять» («RABBIT», 2) », а не, скажем,' populate ([]() {return new RABBIT();}, 2); '? – immibis

ответ

2

Я думаю, что простой способ сделать это будет осуществлять функцию шаблона.

template <typename T> 
void populate(int maxPop) { 
    int i = 0; 

    while (i < maxPop) 
    { 
     randX = rand() % GRIDHEIGHT; 
     randY = rand() % GRIDWIDTH; 

     if (!(grid[randX][randY].Has_An_Animal())) 
     { 
      grid[randX][randY].animal = new T(); 
      i++; 
     } 
    } 
} 

И затем вызвать функцию с соответствующим типом просто:

populate<RABBIT>(10); 
+0

Я посмотрел на ваше решение, оглянулся на меня и рассмеялся. Это потрясающе! Я полностью забыл шаблоны. Спасибо! – user3487243

+0

У меня такая же проблема, мне всегда приходится спрашивать себя, будут ли основы работать на мою ситуацию. – Stephen

Смежные вопросы