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,但我对任何事情都持开放态度。后者也让我好奇。我看了看你的解决方案,又看了看我的,笑了。这太完美了!我完全忽略了模板。非常感谢。我也有同样的问题,我总是要问自己,这些基础知识是否适合我的情况。