切换受保护的范围C ++ xcode

时间:2015-02-04 01:06:09

标签: c++ switch-statement case

我在保护范围内出现错误'用这个代码。它与本网站上的其他人有一个模糊的相似问题,但我不是在案例中初始化变量,而添加大括号没有区别。

                switch (switchval){

                case 1:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByDurationLow);  //chooses op with smallest duration
                    break;

                case 2:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByDurationHigh);  //chooses op with biggest duration
                    break;

                case 3:
                    //chooses op with lowest total job time remaining - need to calculate these
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByRemainingJobTimeLow);
                    break;

                case 4:
                     //chooses op with lowest total job time remaining - need to calculate these
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByRemainingJobTimeHigh);
                    break;

                case 5:
                    //this chooses randomly!
                    int randVal = round(randomGen(-0.49999, opsThatCanWork.size()-1+0.49999));
                    opsThatCanWork.at(0) = opsThatCanWork.at(randVal);
                    break;

                case 6:
                    //first in the quene for a machine
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByStartTimeLow);
                    break;


                case 7:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByStartTimeHigh);
                    break;


            }

错误出现在说明情况6'和'案例7'

3 个答案:

答案 0 :(得分:4)

跳转(包括从switch跳转到案例)不允许绕过初始化变量的声明,但有限数量的情况除外。

  

可以转换为块,但不能以初始化绕过声明的方式。一个   程序从具有自动存储持续时间的变量不在范围内的点跳转到a   除非变量具有标量类型,具有普通默认值的类类型,否则它在范围内的点是不正确的   构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组   在没有初始化器(8.5)的情况下声明前面的类型。

因此,如果你在宣言上有一个初始化者,那绝对是禁止的。

请注意,案例6和7会触发错误,因为如果跳转到案例5,标签是之前声明,所以没有问题。

正如您在另一个答案的评论中已经注意到的那样,在案例5中围绕变量的初始化添加大括号可以解决问题。

答案 1 :(得分:1)

                case 5:
                //this chooses randomly!
----------------V variable initialization
                int randVal = round(randomGen(-0.49999, opsThatCanWork.size()-1+0.49999));
                opsThatCanWork.at(0) = opsThatCanWork.at(randVal);
                break;

答案 2 :(得分:0)

警告:这不是您问题的直接答案 - 但在重新编写代码时可能会有所帮助。

根据您的案例5的代码,您似乎只需要选择最小项目(根据各种衡量方法之一)并将其放入opsThatCanWork[0]

如果是这种情况,您可以使用std::min_element代替std::sort来提高所有其他情况(我的意思是5除外)的代码运行速度。 std::sort花费了相当多的时间将所有项目按顺序排列,但您显然只关心找到一个元素。这正是std::min_element设计的工作。

至少乍一看,它看起来像你的案例5的代码也可能有一个错误。所有其他案例只是重新排列opsThatCanWork中的现有元素。但是,案例5的代码用其他一些随机值覆盖现有的第一个值。如果您只执行一次此代码,并且不再需要该数组/向量,那么这可能没问题 - 但如果您再次使用该向量中的数据,那么每次执行案例5的代码,您将丢失另一个数据项(并最终得到两个相同的项)。重复几千次,你的数组可能包含N个单个值而不是N个值的副本。

您可能希望通过使用随机选择的元素交换opsThatCanWork[0]而不是覆盖它来解决此问题。