C++ “地图”;“兔子”;要调用new的字符串";“兔子”;()

C++ “地图”;“兔子”;要调用new的字符串";“兔子”;(),c++,string,oop,object,mapping,C++,String,Oop,Object,Mapping,我必须用兔子、松鼠、狼和猎豹填充我的网格。我正在寻找字符串到类型对象的映射 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, n

我必须用兔子、松鼠、狼和猎豹填充我的
网格。我正在寻找字符串到类型对象的映射

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
单元格网格[GRIDHEIGHT][GRIDWIDTH];
void填充()
{
兔子数量=0,松鼠数量=0,狼数量=0,猎豹数量=0;
int random,randX,randY;
srand((int)time(NULL));
而(兔子数量<10只)
{
randX=rand()%GRIDHEIGHT;
randY=rand()%GRIDWIDTH;
如果(!(网格[randX][randY].有动物())
{
网格[randX][randY]。动物=新兔子();
num_兔++;
}
}
而(松鼠数量<10)
{
randX=rand()%GRIDHEIGHT;
randY=rand()%GRIDWIDTH;
如果(!(网格[randX][randY].有动物())
{
网格[randX][randY].animal=新松鼠();
num_松鼠++;
}
}
而(数量小于3)
{
randX=rand()%GRIDHEIGHT;
randY=rand()%GRIDWIDTH;
如果(!(网格[randX][randY].有动物())
{
网格[randX][randY]。动物=新狼();
num_++;
}
}
而(猎豹数量<2)
{
randX=rand()%GRIDHEIGHT;
randY=rand()%GRIDWIDTH;
如果(!(网格[randX][randY].有动物())
{
grid[randX][randY].animal=新猎豹();
num_猎豹++;
}
}
}//结束

我认为一个简单的方法是实现一个模板函数

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++;
        }
    }
}
模板
无效填充(int-maxPop){
int i=0;
而(i
然后用适当的类型调用函数:

populate<RABBIT>(10);
填充(10);

为了澄清,您想创建一个填充函数来创建用作参数类型的对象吗?是的,很抱歉,缺少详细信息。填充(“兔子”,2),应创建2只兔子。真的,我只是想通过使用字符串到对象的映射来优雅地压缩代码而不是,比如说,
填充([](){returnnewrabbit();},2)?警告:使用,强烈建议您使用产生实际随机值的适当的。使用
time(NULL)
作为随机数种子意味着如果在同一秒钟内运行,这将产生相同的结果,并且在许多平台上
rand()
几乎不是随机的。@immibis我更喜欢前者,因为前者可读性更强,更适用于IMO,但我对任何事情都持开放态度。后者也让我好奇。我看了看你的解决方案,又看了看我的,笑了。这太完美了!我完全忽略了模板。非常感谢。我也有同样的问题,我总是要问自己,这些基础知识是否适合我的情况。