簡體   English   中英

如何初始化一個 C++ object 成員,它是一個二維整數數組

[英]How to initialize a C++ object member that is an 2D array of integers

我有一個 class (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 樣式數組的 class 成員(我發現的所有示例似乎都使用 std::vector 或類似的)。 但請注意,此代碼將在不支持使用任何 C++ 標准模板庫類(因此沒有矢量或類似的)的嵌入式環境中運行。

如果我只用 a_arg 和 b_arg 編寫這段代碼,它就可以正常工作。 但是當我添加 c_arg 時,我從編譯器收到以下錯誤消息。

src/main.cpp:54:3: 注意:候選構造函數不可行:無法將初始化列表參數轉換為 'int ** ' foo(int a_arg, int b_arg, int** c_arg): a(a_arg),b(b_arg ), c(c_arg)

看起來{{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  };
}

如編譯器錯誤中所述, {{1,2,3},{4,5,6},{7,8,9}}是“初始化列表”而不是數組。 另外int** c不是一個二維整數數組,而是一個指向 integer 指針數組的指針。 為了得到你想要的東西,你可以在你的主 function 中做這樣的事情:

    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)); 也不正確。 您正在 memory 中的某處創建一個指針,其中包含 9 個整數的空間,但您隨后將其轉換為一個包含 9 個整數指針的數組。

或者,如果您知道數組第二維的界限將始終為 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];

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM