2012-09-06 54 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(); 

我希望能幫助到你。