0

如何遍历数组来操作或访问不同的对象及其成员函数?我有 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();
    }
}
4

4 回答 4

2

你的问题有点令人困惑。您需要提供 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 类应该具有覆盖的相等运算符。

于 2012-09-06T20:38:50.947 回答
2

你需要做这样的事情:

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();

我希望它有所帮助。

于 2012-09-06T21:07:51.313 回答
1

目前还不完全清楚你想要做什么,但这里有一个尝试:

Color red, green, blue, yellow, purple;
Color *colors[5] = {&red, &green, &blue, &yellow, &purple};
for (int i = 0; i < 5; i++) {
   colors[i]->set();
}
于 2012-09-06T20:36:31.183 回答
1

您的示例一开始就令人费解且设计不佳。如果网格只是存储对飞船的引用(实际上是指针),那么您就不需要循环开始了!考虑:

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 },
                                           /* ... */ };
于 2012-09-06T21:00:46.980 回答