C++中如何将指针对象数组传入构造函数?PCBTable初始化报错
问题原因
你在头文件里定义的PCB* table[]是未指定大小的数组声明,在C++中这类成员属于不完整类型,而且数组变量本身是不可修改的左值,无法直接用=赋值,所以编译器抛出报错。
修复方案
有两种可靠的实现方式:
方式一:改用指针成员管理动态数组
修改头文件的类定义,将table改为指向指针的指针,同时新增成员存储数组大小,方便后续操作:
class PCBTable { private: PCB** table; int tableSize; public: PCBTable(int size); ~PCBTable(); // 必须添加析构函数释放内存 };
实现构造函数与析构函数:
PCBTable::PCBTable(int size) : tableSize(size) { table = new PCB*[size]; // 可选:初始化每个指针为nullptr,避免野指针 for (int i = 0; i < size; ++i) { table[i] = nullptr; } } PCBTable::~PCBTable() { // 若每个PCB*指向new创建的对象,需先逐个delete释放 // for (int i = 0; i < tableSize; ++i) { // delete table[i]; // } delete[] table; // 释放指针数组本身 }
方式二:使用标准库容器(更推荐)
直接用std::vector<PCB*>替代手动管理的动态数组,无需手动处理内存:
#include <vector> class PCBTable { private: std::vector<PCB*> table; public: PCBTable(int size); };
构造函数实现:
PCBTable::PCBTable(int size) : table(size, nullptr) { // vector会自动初始化size个nullptr元素,内存管理由容器自动完成 }
这种方式无需手动编写析构函数,vector会自动释放内存,安全性更高。
关键说明
- C++不支持类成员中使用未指定大小的数组(即原代码中的
PCB* table[]),必须改用指针或标准容器实现动态大小的数组。 - 数组名是常量指针,无法被赋值,
table = new PCB*[size]这类写法本质上不符合C++语法规则。
内容的提问来源于stack exchange,提问作者a true scotsman uth
相关产品推荐
相关产品推荐

