C++向成员函数传int数组指针报invalid types 'int[int]'错误求助
问题修复方案
编译错误原因与修复
错误1:invalid types 'int[int]' for array subscript
这个错误是多个类型不匹配问题共同导致的:
- 成员变量
partMesh类型错误:你要存储二维的ElementClass网格单元,现有定义int *partMesh是int类型一维指针,既不支持[i][j]二维下标访问,也无法存储ElementClass类型数据,需要修改为ElementClass** partMesh(指向指针的指针,用于存储动态二维数组)。 - 二维数组动态申请方式错误:
new int[MESHROW][MESHCOL]的写法仅当第二维是编译期常量时合法,你的MESHCOL是运行时计算的数值,需要先申请存储行指针的一维数组,再为每一行单独申请存储单元的数组。 meshingPart参数定义错误:参数类型写成了const int &和你传入的指针地址完全不匹配,且成员函数可以直接访问类的成员变量,完全不需要额外传递partMesh参数,多余的参数还会和成员变量重名造成混淆。- 循环变量未初始化:
for( int i; i < inRow; i++)里的i、j没有初始化初值为0,会导致循环次数异常、数组越界。
错误2:expected constructor, destructor, or type conversion before '(' token
这个错误是构造函数实现时遗漏了参数的类型声明,你写的PartClass :: PartClass(inHeight, inLength, inWidth, inSeed)需要给每个参数补充int类型声明,改成PartClass::PartClass(int inHeight, int inLength, int inWidth, int inSeed)。
另外还有一个隐藏的语法问题:类的const成员变量不能在构造函数体内赋值,必须用构造函数初始化列表完成初始化,因为const变量创建后就不允许修改,函数体内的操作是赋值不是初始化。
printPart函数疑问解答
你现有写法cout << "Part mesh:" << *partMesh << endl;既不会打印完整数组,也不会打印指针地址:*partMesh等价于partMesh[0][0],只会打印二维数组第一个元素的值。如果想要打印整个网格的单元ID,需要嵌套循环遍历所有[i][j]位置的元素输出。
修正后核心代码示例
#include <iostream> using namespace std; class ElementClass { private: int elemID; static int numElems; // Shape functions: int N1; int N2; int N3; int N4; public: // 新增获取单元ID的接口 int getElemID() const { return elemID; } // Default constructor ElementClass() { elemID = numElems; numElems++; }; }; // 静态成员变量类外初始化 int ElementClass::numElems = 0; class PartClass { private: const int HEIGHT; // mm const int LENGTH; // mm const int WIDTH; // mm const int SEED; // mm const int MESHROW; const int MESHCOL; ElementClass **partMesh; // 修改为ElementClass二维指针 void meshingPart(int inRow, int inCol); // 移除多余的partMesh参数 public: // 构造函数用初始化列表初始化const成员 PartClass(int inHeight, int inLength, int inWidth, int inSeed); // 析构函数释放动态申请的内存,避免内存泄漏 ~PartClass(); void printPart() { cout << "Part mesh elemID:" << endl; for(int i=0; i<MESHROW; i++){ for(int j=0; j<MESHCOL; j++){ cout << partMesh[i][j].getElemID() << "\t"; } cout << endl; } } }; // 构造函数实现,用初始化列表初始化const成员 PartClass::PartClass(int inHeight, int inLength, int inWidth, int inSeed) : HEIGHT(inHeight), LENGTH(inLength), WIDTH(inWidth), SEED(inSeed), MESHROW(HEIGHT/SEED), MESHCOL(LENGTH/SEED) { // 正确申请二维动态数组 partMesh = new ElementClass*[MESHROW]; for(int i=0; i<MESHROW; i++){ partMesh[i] = new ElementClass[MESHCOL]; } meshingPart(MESHROW, MESHCOL); } // 析构函数释放内存 PartClass::~PartClass() { for(int i=0; i<MESHROW; i++){ delete[] partMesh[i]; } delete[] partMesh; } void PartClass::meshingPart(int inRow, int inCol) { // 这里其实构造数组的时候已经自动调用了ElementClass的构造函数生成单元了 // 如果需要额外初始化可以在这里操作 for(int i=0; i < inRow; i++) { for(int j=0; j < inCol; j++) { // 这里可以做单元的额外初始化操作 } } } // 测试示例 int main(){ PartClass plate(10, 10, 1, 2); plate.printPart(); return 0; }
内容的提问来源于stack exchange,提问作者newbieProgrmr
相关产品推荐
相关产品推荐

