如何在不将全局声明为全局的情况下全局使用变量?

时间:2013-03-10 09:32:59

标签: c++ variables

我有一个像这样的开关语句

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必须在case 1:下声明,randomVariable是一个数组。请尝试坚持使用std库,请不要使用向量,因为这是一个项目,并且在本课程中没有讨论过向量。

4 个答案:

答案 0 :(得分: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);调整了vector内部使用的内存的大小,这样它就足以容纳size个元素,如果它的大小已经增加,它还会向这个内存插入新元素并将它们初始化为0。这里重要的是myVector是一个具有自动存储持续时间的对象,这意味着当执行超出定义范围时,内存会自动清理。这样可以避免在使用动态分配的C风格数组时需要处理的丑陋内存管理。

答案 1 :(得分:1)

如果您必须在案例1中初始化它,那么只需将变量设为指针并在案例1中使用variable = new something();

顺便说一下,这个范围与“全球”无关。

答案 2 :(得分: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;

答案 3 :(得分:0)

变量的范围仅在其定义的块内,因此不可能在一个范围内定义变量,即在case 1:内并在范围外访问它,除非您打算将这些情况组合在一起1和3一起没有明确的块{ ... }

在整个switch语句中可见的范围内定义randomVariable,以便任何案例都可以访问此变量。

{
    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
            }

    }
}

交换机上方的范围可以是函数,也可以是其他块,具体取决于您的代码。