C++ vector存储父类指针创建子类实例报类型说明符错误解决
报错原因
- 核心诱因是类型解析顺序不符合C++编译规则:C++编译器从上到下逐行解析代码,你在
Product类内部的edit方法里直接写new Wet、new Dry时,Wet和Dry两个子类的定义还写在Product类的后面,编译器此时根本不认识这两个类型,就会抛出expected type-specifier before 'Wet'错误。 - 附带语法错误:你写的
Product类构造函数没有闭合函数体,成员变量也没在构造函数初始化列表里赋值,基础语法结构残缺,也会干扰编译流程。
修复方案
按照C++的编译规则调整代码结构即可:
- 先补全
Product类的基础语法,把构造函数写完整,edit方法只在类内保留声明,不要直接写实现。 - 按顺序完成
Wet、Dry两个子类的完整定义,让编译器先识别这两个类型。 - 在所有类定义完成之后,再单独实现
edit方法的具体逻辑。
修正后的参考代码
#include <iostream> #include <vector> #include <string> using namespace std; // 如果你已经在其他头文件定义了Manufacture类,直接引入对应头文件即可 class Manufacture { private: string mName; string mAdd; string mCon; public: Manufacture(string name, string add, string con): mName(name), mAdd(add), mCon(con) {} }; class Product { protected: int quantity; double price; int code; string name; Manufacture manu; public: // 补全构造函数,完成成员初始化 Product(int q, double p, int c, string n, string mName, string mAdd, string mCon) : quantity(q), price(p), code(c), name(n), manu(mName, mAdd, mCon) {} // 类内只保留edit函数声明,不写具体实现 void edit(vector<Product*>& _product); }; // 优先定义两个子类,让编译器提前识别类型 class Wet : public Product { public: Wet(int pQuan, double pPrice, int pCode, string pName, string mName, string mAdd, string mCon) : Product(pQuan, pPrice, pCode, pName, mName, mAdd, mCon) {} }; class Dry : public Product { public: Dry(int pQuan, double pPrice, int pCode, string pName, string mName, string mAdd, string mCon) : Product(pQuan, pPrice, pCode, pName, mName, mAdd, mCon) {} }; // 所有类定义完成后,再实现edit方法的逻辑 void Product::edit(vector<Product*>& _product){ string Pname, Mname, Madd, Mcont; float Pprice; int Pquantity, Pcode; char Pcategory; cout << endl; cout << "enter Product Code:" ; cin >> Pcode; cin.ignore(); // 读取数字后忽略缓冲区残留的换行,保证后续getline能正常读取字符串 cout << "enter Product name:" ; getline(cin,Pname); cout << "enter Product Price:" ; cin >> Pprice; cout << "enter Product Quantity:" ; cin >> Pquantity; cout << "enter Product Category Wet/Dry (w/d):" ; cin >> Pcategory; cout << "enter Manufacturer Name:" ; cin >> Mname; cout << "enter Manufacturer Address:" ; cin >> Madd; cout << "enter Manufacturer Contact Number:" ; cin >> Mcont; if(Pcategory == 'W' || Pcategory == 'w'){ _product.push_back(new Wet(Pquantity, Pprice ,Pcode, Pname, Mname, Madd, Mcont)); } else{ _product.push_back(new Dry(Pquantity, Pprice ,Pcode, Pname, Mname, Madd, Mcont)); } cout << "successfully added new product!" << endl; // 原有goto逻辑根据自己的业务流程保留即可 // goto userInputAddLabel; }
额外注意:存储裸指针Product*的vector在生命周期结束前,需要手动遍历调用delete释放每个对象的内存,避免内存泄漏;如果使用C++11及以上版本,更推荐用vector<unique_ptr<Product>>智能指针容器管理对象,自动处理内存释放。
内容的提问来源于stack exchange,提问作者Woppy
相关产品推荐
相关产品推荐

