1

私はこのようなswitchステートメントを持っています

switch(option)
{
case 1:
{
    int randomVariable;
}
case 2:
{

}
case 3:
{
\\ I want to use randomVariable here but it is not letting me since it is not in the same scope
}

}
}

この問題を解決する方法についてのアイデアはありますか?の下でrandomVariable宣言する必要があり、は配列であることに注意してください。stdライブラリに固執するようにしてください。これはプロジェクト用であり、このクラスではベクトルについてまったく説明されていないため、ベクトルは使用しないでください。case 1:randomVariable

4

5 に答える 5

3

変数にアクセスできる領域は、そのスコープと呼ばれます。ローカルの非静的変数の場合、このスコープの境界は中括弧({... })で定義されるため、次のようになります。

{
    ...
    int a = 0;
    switch (option)
    {
        case 1:
        {
            int b;
            a = 2;
        } // <-- the scope of b ends here
        ...
    }
} // <-- the scope of a ends here

これは配列を作成するオプションであるため、randomVariable内部で宣言する必要があることに注意してくださいcase 1:

C ++でプログラミングしているので、Cスタイルの配列の代わりに、を使用しますstd::vector。これは、配列と同じようにメモリの連続ブロック内に要素を保持するコンテナですが、サイズが変わる可能性があります。

#include <vector>
...
{
    std::vector<int> myVector;
    switch (option)
    {
        case 1:
        {
            int size;
            // value retrieved in run-time is assigned into size here
            myVector.resize(size, 0);
        }
        case 2:
        {
            // you can use your vector here:
            if (myVector.size() > 3)
                myVector[2] = 7;
        }
        ...
    }
} // <-- end of myVector's scope

この例でmyVector.resize(size, 0);は、ベクトルによって内部的に使用されるメモリのサイズを変更して、要素を保持するのに十分な大きさにします。sizeサイズが大きくなると、このメモリに新しい要素を挿入し、それらをに初期化します0。ここで重要なmyVectorのは、自動保存期間を持つオブジェクトです。つまり、実行が定義されたスコープから外れると、メモリが自動的にクリーンアップされます。これにより、動的に割り当てられたCスタイルの配列を使用する場合に注意しなければならない醜いメモリ管理から解放されます。

于 2013-03-10T09:43:26.030 に答える
1

ケース1で初期化する必要があるという制限がある場合は、変数をポインターにしてvariable = new something();、ケース1で使用します。

ちなみに、このスコープは「グローバル」とは何の関係もありません。

于 2013-03-10T09:39:15.087 に答える
1

編集

コメントの後、ユースケースとして、おそらく次のようなものが必要になります。

int * myArr = 0;
int myArrSize = 10;

switch (option) {
  case 1:
    if (myArr != 0) {
      // Clean up memory if we are re-initializing
      delete [] myArr;
    }
    myArr = new int[myArrSize];
    break;
  case 2:
    break;
  case 3:
    int test = myArr[1];
    break;
}

// Clean up memory when we are done with the array
delete [] myArr;
于 2013-03-10T09:39:18.540 に答える
0

case 1:変数のスコープは、定義されたブロック内にのみ存在するため、明示的なブロックなしで1と3のケースを組み合わせる場合を除いて、1つのスコープで変数を定義すること、つまりスコープ内で変数にアクセスしてアクセスすることはできません。 { ... }

randomVariableどんな場合でもこの変数にアクセスできるように、switchステートメント全体に表示されるスコープでを定義します。

{
    int randomVariable;
    switch(option)
    {
        case 1:
            {

            }
        case 2:
            {

            }
        case 3:
            {
                \\ I want to use randomVariable here but it is not letting me since it is not in the same scope
            }

    }
}

スイッチの上のスコープは、コードに応じて関数または別のブロックになります。

于 2013-03-10T09:35:12.143 に答える
0

どうぞ...

  • 新しいクラスを作成します(たとえば、superClassの場合)。
  • getter&setterメソッドを使用してrandomVariableという名前のプロパティフィールドのスタブを作成します。
  • そのプロパティを静的にします。(オブジェクトの違いが異なっていても、その値をグローバルに同じように使用できるようにします)。
  • switchステートメントを配置するクラスでこのクラスを継承します。
  • これで、新しい値または古い値を設定することにより、任意の場所でrandomvariableを初期化して使用できます。

これがお役に立てば幸いです..!!!

于 2013-03-10T09:49:08.587 に答える