将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”

Posted

技术标签:

【中文标题】将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”【英文标题】:Passing a pointer to an int array to a member function, error: invalid types 'int[int]' for array subscript 【发布时间】:2021-12-25 17:27:12 【问题描述】:

好的,我对编程和 c++ 还很陌生,所以请放轻松。我正在尝试编写一个程序,该程序采用金属板的尺寸进行二维有限元方法分析(忽略厚度)。因此,我为我的零件(板)创建了一个类,为网格创建了元素,为元素创建了节点。网格将由方形元素组成,并将应用于板的正面。现在,我正在着手整理网格,然后再继续讨论元素和节点类。

我正在使用(或想要使用)动态分配来创建一个包含网格元素的二维数组(我的网格)。我正在尝试编写一个函数“meshingPart”来创建二维数组,其中行数是板的高度,列是板的长度。

当我运行程序时,我得到了这些错误,我不知道如何修复它们:

 In member function 'void PartClass::meshingPart(int&, int, int)':
 error: invalid types 'int[int]' for array subscript

 At global scope:
 error: expected constructor, destructor, or type conversion before '(' token

另外,当我使用 printPart() 函数时,它会打印指针的地址还是数组的值?我对此并不完全确定,我对指针也很陌生。

任何帮助将不胜感激!提前致谢。

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;
      int *partMesh; // Mesh array - an int pointer
      
      // Creates the mesh for the part by generating elements to fill the width and length 
      // of the part. The elements are stored in a 2-D array. 
      void meshingPart(const int &partMesh, int inRow, int inCol);
    
    public:
      // Constructs a part with the given parameters, seeds the part for the mesh, 
      // then creates the mesh by generating square elements with length = height = SEED. 
      PartClass(int inHeight, int inLength, int inWidth, int inSeed);

      void printPart()
      
        cout << "Part mesh:" << *partMesh << endl;
      
;

class ElementClass

    private:
      int elemID;
      static int numElems;

      // Shape functions:
      int N1;
      int N2;
      int N3;
      int N4;
      
    public:

      // Default constructor
      ElementClass()
      
        elemID = numElems;
        numElems++;
      ;
;

PartClass :: PartClass(inHeight, inLength, inWidth, inSeed)

  HEIGHT = inHeight;
  LENGTH = inLength;
  WIDTH = inWidth;
  SEED = inSeed;
  MESHROW = HEIGHT/SEED; 
  MESHCOL = LENGTH/SEED; 

  // Dynamically declares an array, gets memory, assigns address to partMesh.
  partMesh = new int[MESHROW][MESHCOL]; 

  meshingPart(&partMesh, MESHROW, MESHCOL);



void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)
 
  
  for( int i; i < inRow; i++)
  
    for( int j; j < inCol; j++)
    
      partMesh[i][j] = ElementClass();
    
  

【问题讨论】:

问题似乎是拼写错误。你声明PartClass(int inHeight...,然后定义PartClass(inHeight...(你忘了int)。你声明meshingPart(const int &amp;partMesh...,然后定义meshingPart(int &amp;partMesh...(你忘了const 您还需要了解constructor initialization lists。对于const int HEIGHTconst 表示“HEIGHT 无法更改”。与此相反,HEIGHT = inHeight; 的意思是“改变HEIGHT”。 【参考方案1】:

显示的代码存在多个问题,而不是一个问题。必须修复所有问题才能解决所有编译错误。

void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)

这个类方法的第一个参数被声明为对一个单独的int的引用。它不是一个数组,因此这个类方法中的代码将它视为一个数组会让你的 C++ 编译器非常非常难过。

int *partMesh; //

partMesh = new int[MESHROW][MESHCOL]; 

partMesh 被声明为指向int 的指针。 new 表达式有效地产生了一个指向 MESHCOL 整数数组的指针。在 C++ 中,您不能将指向数组的指针转换为不同类型的指针。

此外,这里显示的任何内容都不需要首先使用newpartMesh 可以简单地是 std::vector&lt;vector&lt;int&gt;&gt;,而 new 被战略性的 resize() 取代。作为额外的奖励,您的 C++ 程序将在不再需要时自动删除所有这些内存,不会泄漏它,并在需要的地方实现正确的复制/移动语义!

meshingPart(&partMesh, MESHROW, MESHCOL);

正如我们已经得出的结论,函数的第一个参数是对数组的引用。将指向int 的指针的地址传递给它也不起作用。

此外,由于partMesh 是同一类的成员,因此类中的一个函数以某种形式传递给另一个类的方法绝对有用,无论如何。由于它是同一个类的成员,不需要传递,类方法可以直接访问它。毕竟,这就是课程的意义所在。

总结:

    导致这些编译错误的 C++ 类型系统存在几个问题。

    这里甚至不需要使用new来初始化指针,要么需要调整其类型以反映它是指向二维数组的指针,要么需要调整new语句本身分配一维数组,因为这是 C++ 允许您转换为普通指针的唯一方法。即使这样也被过度设计了,因为std::vector 会自己处理所有这些讨厌的细节。

    甚至不需要将同一个类的成员传递给同一个类的方法,作为参数,直接让类方法访问即可。

    很明显,产生所示代码的可能过程是完整地编写它,并且仅在整个编写完成后才尝试编译。每当使用这种方法时,几乎肯定会出现大量编译错误。通过一次只写几行代码、测试它们、确保它们正常工作,然后再写几行来编写一个大程序会更有效率。这样一来,需要修复的错误数量将保持在非常少且易于管理的范围内。

【讨论】:

感谢您的宝贵时间。我会根据您的建议工作!

以上是关于将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”的主要内容,如果未能解决你的问题,请参考以下文章

将指向外部类模板的成员函数的指针传递给嵌套类

如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?

无法将指向派生类函数的指针传递给基类

将指向成员函数的指针传递给单独的线程

我应该如何将指向成员函数的指针传递给 OpenCV 中的 setMouseCallback?

c ++按值或指向函数语法的指针传递数组