switch语句块内动态分配一个类的空间,为什么会说指针的初始化会被case和default跳过?

#include <iostream>
using namespace std;
class Object {
public:
    double s;
    char* name;
    virtual void input(){}
    Object():s(0),name(NULL){}
    void output() {
        cout << name << " " << s << endl;
    }

};
class Rectangle :public Object {//长方形
public:
    virtual void input();
    Rectangle() :Object() {}
};
class Circle :public Object {//圆
public:
    virtual void input();
    Circle() :Object() {}

};
void Rectangle::input() {
    name =(char *) "Rectangle";
    int a, b;
    cin >> a >> b;
    s = a * b;

}
void Circle::input() {
    name = (char*)"Circle";
    int r;
    cin >> r;
    s = r * r * 3.14;;
}
int main()
{
    int num = 0;
    cin >> num;//num是输入的几何形体的个数
    Object** p = new Object * [num];
    for (int i = 0;i < num;i++) {
        char shape;
        cin >> shape;
        switch (shape)//根据不同的形状,分配出不同的几何形体类。
        {
        case 'R':
            Rectangle * rp = new Rectangle;
            p[i] = rp;
            p[i]->input();
        case 'C':
            Circle * rc = new Circle;
            p[i] = rc;
            p[i]->input();
        default:
            break;
        }
    }
    delete[] p;
    return 0;
    
}

如图switch块内的加粗语句。
调试显示错误:
image.png
image.png
如果用if语句代替就是对的,这是为什么?

阅读 3k
4 个回答

因为多个case属于同一个作用域 case 'C'中可以访问rp,但是rp可能没有被初始化,使用{}声明独立的作用域 或者 break提前返回

{}是局部变量的作用域界限,没有{}那就是同一个代码块

使用 {} 和break,额,switch基本没用没想到都不会用了,要再去补补。

新手上路,请多包涵

你只需要用{}把case块的内容包起来就行了 。
因为如果没有{},就会有作用域的歧义,所以编译器不让你通过

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题