0
header1.h

#define MaxNum 10
#define MinNum 1
//similar 100 other variables defined 

main.cpp

#include header1.h
main()
{
  int size;
  string first = "MaxNum"; //could be any of the variable name defined in header file 

  size = MaxNum ; 

ヘッダー ファイルで特定の変数が定義されています。主に、「最初」の値に応じて、「サイズ」の値を設定する必要があります。これは可能ですか?

4

1 に答える 1

3

私はあなたが持っていると思います

size = MaxNum

もしfirst == "MaxNum"そして

size = MinNum

もしfirst == "MinNum"。(選択する変数のセット) の可能な値のセットが小さい場合は、一連のステートメントのfirst周りに割り当てを配置するだけで済みます。最後にエラーメッセージを書くステートメントを入れます。ifelse ifelse

ただし、すべてのケースをハードコーディングする必要があります。

if (first == "MaxNum") {
    size = MaxNum;
}
else if (first == "MinNum") {
    size = MinNum;
}
//...

sizeしたがって、変数の数が増えるにつれて、割り当てを決定するコードが大きくなります。これは悪いスタイルであり、非常にメンテナンスが難しく、エラーが発生しやすいと考えられています。

これを行いたくない場合は、プログラムで複数の変数を使用しないでください。ただし、これらすべての可能なキーとその値を含む 1 つのコンテナー変数を使用してください。アソシエイト コンテナと呼ばれるもので、C++ にはそのstd::mapようなデータ構造を実装する型があります。

// Your container for the sizes (or whatever you want to call it)
std::map<std::string, int> sizes; 
sizes["MinNum"] = 1;
sizes["MaxNum"] = 100;
// ... more values ...

// Accessing this container with a variable as the key:
size = sizes[first];

ご覧のとおり、文字列変数をキーとして使用してこのコンテナーにアクセスするのは非常に簡単です。sizes[first]キーが変数の現在の内容の値と等しいコンテナー内の値を単に提供しますfirst

C++ (および C) ソース コードに関する非常に重要な事実は、実行時に変数の名前にアクセスできないことです。したがって、基本的に、プログラムに影響を与えることなく名前を変更できます。必要なもの (変数、列挙型、クラス、関数、それらのパラメーターなどの名前のクエリ) は、コード上で動作するコード (「メタコード」) を記述するため、イントロスペクションまたはメタプログラミングとして知られています。

C++ は、デフォルトではメタプログラミング機能を提供していません (私が知っている唯一の例外: typeid、変数名/定義には何もありません)。デフォルトでは、この制限をハックして、これらの定義のヘッダー ファイルを解析し、実行時にアクセス可能な別の方法でそれらを格納する追加のステップをビルド プロセスに含めることができます。しかし、地図はより良い方法です、私を信じてください.

于 2013-04-10T19:38:48.430 に答える