如何遍历数组来操作或访问不同的对象及其成员函数?我有10件物品。现在,我有相同的代码访问每个对象成员函数,并操作基本上为每个对象复制和粘贴的对象数据。我只是想知道是否有一种方法可以使用循环一次性编写代码,并使其循环通过所有10个对象。
而不是像下面这样手动操作:
Color red.set();
Color green.set();
Color blue.set();
Color yellow.set();
Color purple.set();
...
有没有一种方法可以通过循环来做到这一点,比如下面的:
colors[5] = {"red", "green", "blue", "yellow", "purple", ...};
for(int i = 0; i < 10; i++){
Color colors[i].set();
}
我知道PHP做类似的事情是这样的:
$colors = array("red", "green", "blue", "yellow", "purple" ...);
for($i = 0; $i < 10; $i++){
${$colors[$i]} = $colors[$i];
// $red = "red";
}
对C++来说有可能做到这一点吗?
下面是另一个例子,说明我为什么要问这个问题,以及我得到的是什么:而不是:
if(grid[row][col].ship == "red")
{
red.setShipDamage();
if(red.getShipSunk() == true)
red.destroy();
}
else if(grid[row][col].ship == "green")
{
green.setShipDamage();
if(green.getShipSunk() == true)
green.destroy();
}
else if( ... )
要在一个循环中完成所有这些:
for(int i = 0; i < 10; i++)
{
if(grid[row][col].ship == colors[i])
{
**colors[i]**.setShipDamage();
if(**colors[i]**.getShipSunk() == true)
**colors[i]**.destroy();
}
}
您需要这样做:
std::map<std::string, Color*> colors;
colors["red"] = &red;
colors["green"] = &green;
colors["blue"] = &blue;
colors["purple"] = &purple;
///....
Color *color = colors[grid[row][col].ship];
color->setShipDamage();
if(color->getShipSunk() == true)
color->destroy();
我希望它能有所帮助。
您的问题有些令人困惑。您需要提供Color类的作用。这是你想要的吗?
Color colors[5];
char *color_txt[5] = {"red", "green", "blue", "yellow", "purple"};
for (int i = 0; i < 5; i++){
colors[i].set(color_txt[i]);
}
根据您编辑的问题,您可以创建一个对象数组,如我所述:
Color colors[10];
假设每个对象都有一个默认构造函数。然后,您可以通过数组中的索引访问每个对象。因此,您的示例如预期的那样工作:
for(int i = 0; i < 10; i++)
{
if(grid[row][col].ship == colors[i])
{
colors[i].setShipDamage();
if(colors[i].getShipSunk() == true)
colors[i].destroy();
}
}
此外,Color类应该有一个overriden相等运算符。
还不完全清楚你想做什么,但这里有一个尝试:
Color red, green, blue, yellow, purple;
Color *colors[5] = {&red, &green, &blue, &yellow, &purple};
for (int i = 0; i < 5; i++) {
colors[i]->set();
}
您的示例一开始就很复杂,设计得很糟糕。如果网格只是存储了对船只的引用(实际上是指针),那么您就不需要循环了!考虑:
if (Ship* ship = grid[y][x].ship()) {// ship() returns nullptr if there's no ship
ship->setDamage();
if (ship->sunk())
// ...
}
另一方面,如果希望将字符串与船舶关联,则需要一个关联容器,如标准库中的unordered_map
:
Ship red, green, blue, white;
std::unordered_map<std::string, Ship*> = { { "red", &red },
{ "green", &green },
/* ... */ };