我有一个像这样的开关语句
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库,请不要使用向量,因为这是一个项目,并且在本课程中没有讨论过向量。
答案 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
}
}
}
交换机上方的范围可以是函数,也可以是其他块,具体取决于您的代码。