0

配列を反復処理して、さまざまなオブジェクトとそのメンバー関数を操作またはアクセスするにはどうすればよいでしょうか? 私は10個のオブジェクトを持っています。現在、各オブジェクト メンバー関数にアクセスし、基本的に各オブジェクトにコピー アンド ペーストされたオブジェクト データを操作する同じコードがあります。ループを使用してそのコードを 1 回記述し、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( ... )

このすべてをループで 1 回実行するには:

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

あなたはこのようなことをする必要があります:

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 に答える
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 に答える
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 に答える