如何初始化一个二维整数数组的C++对象成员

mu0hgdu0  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个类(foo),它有一个成员(c),我希望它是一个二维整数数组,由于某种原因,我不能让初始化器列表在数组上正常工作。

49:  class foo{
50:  public: 
51:    int a;
52:    int b;
53:    int** c;
54:    foo(int a_arg, int b_arg, int** c_arg) : a(a_arg),b(b_arg), c(c_arg)
55:    {}
56:  };//end of class
57:  
58:  int main() {
59:    foo bar{5,7, {{1,2,3},{4,5,6},{7,8,9}}  };
60:  }

我在网上找到了很多成员初始化列表的例子,但是没有一个是专门处理一个碰巧是C风格数组的类成员的(我找到的所有例子似乎都使用了std::vector或类似的)。但是请注意,这段代码将在一个嵌入式环境中运行,该环境不支持使用任何C++标准模板库类(因此没有vector或类似的)。
如果我只使用a_arg和B_arg编写代码,它可以正常工作,但是当我添加c_arg时,我从编译器得到以下错误消息。
源代码/主.cpp:54:3:注:候选构造函数不可行:无法将初始值设定项列表参数转换为“int**”foo(int a_arg,int B_arg,intc_arg):a(a_参数)、B(b_参数)、c(c_参数)
看起来
{{1,2,3},{4,5,6},{7,8,9}}的类型不是int,但如果不是这样,那是什么呢?我试着在c和c_arg的定义上添加各种类型修饰符,但似乎都不起作用。
如果第三个参数是int**类型的变量,那么它就可以编译,但是我没有得到我想要的初始值。

class foo{
  public: 
  int a;
  int b;
  int** c;
  foo(int a_arg, int b_arg, int** c_arg) : a(a_arg),b(b_arg), c(c_arg)
  {}
};//end of class

int main() {
  int** xxx = (int**)malloc(9*sizeof(int));
  foo bar{5,7, xxx  };
}
g52tjvyc

g52tjvyc1#

如编译器错误中所述,{{1,2,3},{4,5,6},{7,8,9}}是一个“初始化列表”,而不是数组。同样,int** c也不是一个二维整数数组,而是一个指向整数指针数组的指针。要得到你想要的,你可以在你的main函数中做如下操作:

int main() {
    
      int  data[] = {1,2,3,4,5,6,7,8,9};
      int* arr2d[] = { &data[0], &data[3], &data[6] };
    
      foo bar{5,7, arr2d };
    
      std::cout << arr2d[1][1]; // will print 5
    
    }

还要注意int** xxx = (int**)malloc(9*sizeof(int));也是不正确的,你在内存的某个地方创建了一个可以容纳9个int型指针的指针,但是你却把它转换成了一个包含9个int型指针的数组。
或者,如果您知道数组的第二维上的边界将始终为3,则可以执行以下操作:

class foo{
public: 
  int a;
  int b;
  int (*c)[3];
  foo(int a_arg, int b_arg, int (*c_arg)[3]) : a(a_arg),b(b_arg), c(c_arg)
  {}
};

int main() {

  int arr2d[][] = { {1,2,3}, {4,5,6}, {7,8,9} };
  foo bar{ 5, 7, arr2d };

  std::cout << data[1][1];

}

相关问题