求助抽象类指针未初始化

#include <iostream>
#include <string>
using namespace std;


class Shape {
public:
Shape() {}
virtual ~Shape() {}
virtual double GetArea() = 0;
virtual double GetPerim() = 0;
virtual void Draw() = 0;
};

class Circle : public Shape {
public:
Circle(int radius) : itsRadius(radius) {}
virtual ~Circle() {}
double GetArea() {
return 3.14 * itsRadius * itsRadius;
}
double GetPerim() { return 2 * 3.14 * itsRadius; }
void Draw();

private:
int itsRadius;
};

void Circle::Draw() { cout << "Circle drawing routing here!\n"; }

class Rectangle : public Shape {
public:
Rectangle(int len, int width) : itsLength(len), itsWidth(width) {}
virtual ~Rectangle() {}
double GetArea() { return itsLength * itsWidth; }
double GetPerim() { return 2 * itsLength * itsWidth; }
virtual int GetLength() { return itsLength; }
virtual int GetWidth() { return itsWidth; }
void Draw();

private:
int itsWidth;
int itsLength;
};

void Rectangle::Draw() {
for (int i = 0; i < itsLength; i++) {
for (int j = 0; j < itsWidth; j++) cout << "x ";
cout << "\n";
}
}

class Square : public Rectangle {
public:
Square(int len);
Square(int len, int width);
virtual ~Square(){};
double GetPerim() { return 4 * GetLength(); }
double GetArea() { return GetLength() * GetLength(); }
};

Square::Square(int len) : Rectangle(len, len) {}
Square::Square(int len, int width) : Rectangle(len, width) {
if (GetLength() != GetWidth()) cout << "error not a Square!\n";
}

int main() {
int choice;
Shape *sp;
bool fQuit = false;
while (fQuit == false) {
cout << "(1)Circle (2)Rectangle (3)Square (0)Quit:";
cin >> choice;
switch (choice) {
case 1:
sp = new Circle(5);

break;
case 2:
sp = new Rectangle(4, 6);

break;
case 3:
sp = new Square(5);

break;
case 0:
fQuit = true;
break;
}
if (fQuit==false) {
sp->Draw();//编译时这行出错,应该是sp没有在switch中建立派生类对象,导致仍是抽象类指针.但我从流程上看并没有错的地方.求高手帮忙解惑.
delete sp;
cout << endl;
}
}
return 0;
}
...全文
80 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 SleekStone 的回复:
因为现在的编译器都比较智能了,会检查到第69行的sp没有被初始化,将第69行代码改为Shape *sp = nullptr;就能编过了,然后你这个代码有点问题,你可以试着输入5,修改的话:将第69行代码改为Shape *sp = nullptr;第91行改为 if (nullptr != sp)
switch里面没有写default,我现在补了上去谢谢. 主要是我按视频教程打的,他在VS 2010上能过,我这里过不了,就觉得很郁闷.我也猜应该是编译器的关系,但就是不知道如何改,我曾试着把91行改成if(sp!=NULL)也不行...,原来要手动指明是nullptr.谢谢...
SleekStone 2020-11-06
  • 打赏
  • 举报
回复
因为现在的编译器都比较智能了,会检查到第69行的sp没有被初始化,将第69行代码改为Shape *sp = nullptr;就能编过了,然后你这个代码有点问题,你可以试着输入5,修改的话:将第69行代码改为Shape *sp = nullptr;第91行改为 if (nullptr != sp)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧