You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ vector存储父类指针创建子类实例报类型说明符错误解决

报错原因
  • 核心诱因是类型解析顺序不符合C++编译规则:C++编译器从上到下逐行解析代码,你在Product类内部的edit方法里直接写new Wet、new Dry时,Wet和Dry两个子类的定义还写在Product类的后面,编译器此时根本不认识这两个类型,就会抛出expected type-specifier before 'Wet'错误。
  • 附带语法错误:你写的Product类构造函数没有闭合函数体,成员变量也没在构造函数初始化列表里赋值,基础语法结构残缺,也会干扰编译流程。
修复方案

按照C++的编译规则调整代码结构即可:

  1. 先补全Product类的基础语法,把构造函数写完整,edit方法只在类内保留声明,不要直接写实现。
  2. 按顺序完成Wet、Dry两个子类的完整定义,让编译器先识别这两个类型。
  3. 在所有类定义完成之后,再单独实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:57:05