2016-08-28 11 views
-2

C++で変数名を「構成する」方法は?このような仮定の状況を考えると

int val1, val2, val3, choice; 
while (expression) { 
    cin >> choice; 
    if (choice == 1) { 
     val1 += expression; 
    } else if (choice == 2) { 
     val2 += expression; 
    } else if (choice == 3) { 
     val3 += expression; 
    } else { 
     expressions..; 
    } 
} 

は彼らを「構成」することができるように、文字列のような変数名を治療する方法はありますか? これは、上記の例や、forループの方がカウンタ値を変数名に追加した方が、サイクルごとに異なる変数が呼び出されるので便利です。このような特徴により

、私の上記の例のようなものになるだろう:私は、このような機能の利点を表現するための最良の例を選んだとは思わない

int val1, val2, val3, choice; 
while (expression) { 
    cin >> choice; 
    if (choice == 1 || choice == 2 || choice == 3) { 
     ['val' + choice] += expression; 
    } else { 
     expressions..; 
    } 
} 

を、とにかく私はこのAを行うために使用しました多くの場合、ループ内のカウンタの値を使用して、配列の別の項目を選択して新しいSQL文に記述するカウンタの値を使用して、PHPとSQLを使用します。

このようなことがC++で可能なら誰でも知っていますか?
何かがわからない場合は、私に知らせてください。
ありがとうございました:)

+1

あなたの質問に明示的に言及しました。 C++には他のすべての言語のような配列があります。 – chris

+0

あなたは配列を使うことができます –

+0

はい、私は知っています。そのような機能をどのように使用できるかについての他の例を作るために、私はそれを言いました。 –

答えて

7

が配列してみてください:

int vals[3] = {0}, choice; 
while (expression) { 
    cin >> choice; 
    if (choice >= 1 && choice <= 3) { 
     // arrays are indexed starting at 0 
     vals[choice-1] += expression; 
    } else { 
     // ... 
    } 
} 
1

真の解決策が配列です。しかし、あなたは本当にあなたがマップを使用することができ、あなたの値に別の名前を添付する場合:

"val1" -> 4 
"val2" -> 3 
"val3" -> 12 

内の文字列を持つマップ:

std::map<std::string, int> vals; 

while (expression) { 
    cin >> choice; 
    if (choice == 1 || choice == 2 || choice == 3) { 
     vals[std::string{"val"} + choice] += expression; 
    } else { 
     expressions..; 
    } 
} 

マップの内容は、次のようなものに見えるかもしれませんキーは動的な名前にもっとも近いものになります。

しかし、私はあなたに保証することができます、この具体的なケースでは、アレイソリューションはがより良いです。動的な名前は悪い考えで、静的な名前に慣れていればC++にしたいです。

1

変数名は実行時オブジェクトではなくコンパイル時のものです。

低整数でオブジェクトを識別する必要がある場合は、配列を持つことが非常に一般的です。

int val[3]; // val1, val2, val3 

// -1 because arrays are 0-based 
val[choice-1]; 

あなたが他の誰かが示唆したように、文字列と同じことを行うには(unordered_mapと呼ばれる)は、ハッシュテーブルを使用することができます。しかし、unordered_mapsはかなり重量のあるオブジェクトです。 #definesと## token paste演算子を使用することもできますが、変数を貼り付けることはできません。コンパイル時の識別子だけを##と連結することができます。

関連する問題