C++类继承中如何在main的switch中正确声明四边形对象a
修正四边形选择程序的编译错误
错误原因
- 每个
case块内声明的a是局部变量,仅在当前case的代码块中有效,一旦跳出case,变量就会被销毁,导致后续调用a.Set()等方法时出现「标识符未定义」的错误 - C++中
switch的所有case分支共享同一个作用域,多个case里声明同名变量a,会触发「重定义」错误
修正方案
利用类继承的多态特性,使用基类指针来管理子类对象:
- 在
main函数开头声明基类指针Quadrangle* a = nullptr; - 在每个
case分支中,动态分配对应子类的对象给指针a - 程序结束前释放动态分配的内存,避免内存泄漏
修正后的代码
#pragma once #include <iostream> #include "Point.h" #include "Quadrangle.h" #include "Trapezoid.h" #include "Parallelogram.h" #include "Rectangle.h" #include "Square.h" using namespace std; int main() { int choice = 0; Quadrangle* a = nullptr; // 基类指针,提前声明 do { cout << "\n----------MENU----------" << endl; cout << "1. Trapezoid" << endl; cout << "2. Parallelogram" << endl; cout << "3. Rectangle" << endl; cout << "4. Square" << endl; cout << "----------" << endl; cout << "Please choose: "; cin >> choice; // 先释放之前的内存(如果有的话) if (a != nullptr) { delete a; a = nullptr; } switch (choice) { case 1: a = new Trapezoid(); break; case 2: a = new Parallelogram(); break; case 3: a = new Rectangle(); break; case 4: a = new Square(); break; default: cout << "Please entry again" << endl; } } while (choice < 1 || choice > 4); if (a != nullptr) { a->Set(); a->CheckCondition(); cout << "Perimeter = " << a->Perimeter() << endl; cout << "Area = " << a->Area() << endl; delete a; // 释放内存 } system("pause"); return 0; }
关键注意点
确保基类Quadrangle中的核心方法都声明为虚函数,这样才能正确调用子类的实现,示例如下:
class Quadrangle { public: virtual void Set() = 0; // 纯虚函数,强制子类实现 virtual void CheckCondition() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; virtual ~Quadrangle() = default; // 虚析构函数,确保子类对象能正确销毁 };
内容的提问来源于stack exchange,提问作者Ricardo Tran
相关产品推荐
相关产品推荐

