如何在C ++构造函数中初始化多维数组

时间:2011-04-30 04:59:53

标签: c++ arrays

我有一个包含一些多维数组的类。我试图在构造函数中初始化这些数组,但我无法弄清楚如何做到这一点。该数组始终具有固定大小。这是我到目前为止所做的:

class foo {
  private: 
    int* matrix; //a 10x10 array

  public:
    foo();

  foo:foo() {
    matrix = new int[10][10]; //throws error
  }

我得到的错误是:

cannot convert `int (*)[10]' to `int*' in assignment 

我该怎么做到这一点?最好,我希望数组默认为全0的10x10数组。

4 个答案:

答案 0 :(得分:4)

#include <memory.h>
class foo
{
    public:
        foo()
        {
            memset(&matrix, 100*sizeof(int), 0);
        }
    private:
        int matrix[10][10];
};

也就是说,如果你没有使用指针来绑定自己(否则你只需将指针传递给memset,而不是对数组的引用)。

答案 1 :(得分:1)

这样做:

int **matrix; //note two '**'

//allocation
matrix = new int*[row]; //in your case, row = 10. also note single '*'
for(int i = 0 ; i < row ; ++i)
   matrix[i] = new int[col]; //in your case, col = 10


 //deallocation
 for(int i = 0 ; i < row ; ++i)
   delete [] matrix[i];
 delete matrix;

建议,而不是使用int**,您可以将std::vector用作:

 std::vector<std::vector<int> > matrix;

//then in the constructor initialization list
foo() : matrix(10, std::vector<int>(10))
{  // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is called initialization list
}

如果您使用此方法,则无需在代码中使用newdelete。此外,矩阵的大小为10x10;您可以matrix[i][j] 0<=i<100<=j<10访问它们;另请注意,matrix中的所有元素都已使用0初始化。

答案 2 :(得分:0)

试试这个:

class foo
{
private:
  int **matrix;

public:
  foo()
  {
    matrix = new int*[10];
    for (size_t i=0; i<10; ++i) 
      matrix[i] = new int[10];
  }

  virtual ~foo()
  {
    for (size_t i=0; i<10; ++i)
      delete[] matrix[i];
    delete[] matrix;
  }
};

答案 3 :(得分:0)

在你的编译器支持C ++ 0x统一初始化之前,如果你想在初始化列表中这样做,我恐怕你必须单独初始化数组中的每个条目。

然而,你可以做的是不初始化,而是分配给构造函数中的数组(简单的for循环)。

在你的代码中你有一个指针,而不是一个数组。看起来你可能想要使用std :: vector,如果你需要一个为你负责内存管理的元素集合。