2012-09-06 52 views
0

如何遍历数组来操作或访问不同的对象及其成员函数?我有10个对象。现在我有相同的代码访问每个对象成员函数,并操作基本上为每个对象复制和粘贴的对象数据。我只是想知道是否有一种方法可以使用循环来编写一段代码,并让它遍历所有10个对象。在C++中迭代对象名称

而不是做类似下面这样手动的:

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(); 
    } 
} 
+1

是的,作为如何在不同语言中完成的示例 – reformed

+0

您最好试着解释您实际尝试在C++中执行的操作。不是每个人都有幸知道PHP。 – juanchopanza

+1

你是什么意思的颜色red.set();'?它应该是函数调用还是变量定义?这不是一个C++语句。 – Mikhail

回答

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类应具有覆盖相等运算符。

+0

使用示例代码更新了问题 – reformed

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(); 
} 
+0

我使用示例代码更新了问题 – reformed

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 }, 
              /* ... */ }; 
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(); 

我希望能帮助到你。