2012-10-28 233 views
1

因此,在一類Foo我的頭文件我宣佈INTS的二維數組,像這樣:在構造函數C++ SET數組大小,複製一個二維數組

int board[][]; 

我故意留出一個大小,因爲我想在構造函數中設置它。初始化後,board[][]的大小不會改變。我的一個構造函數是這樣的:

Foo(int _board[][]); 

在此我想設置board[][]到同樣大小_board[][],並同時複製的內容。我曾試圖在.cpp實現Foo使用此:

Foo::Foo(int _board[][]){ 
board[][] = _board[][]; //Does not work as intended 
} 

然而,這並不像預期的那樣。如何在構造函數中使board[][]_board[][]具有相同的大小和內容?

+0

使用'std :: vector'。 – Mankarse

+0

你不能使用數組而不知道第二維的大小。 –

回答

1

C++與Java不同。 int a[][];不允許作爲變量類型。一些誤導C++的特點是,第一尺寸允許被留爲空:

int foo(int a[]); 
int foo(int a[][3]); 
int foo(int a[][3][4]); 

另一個誤導C++特徵是,這是在陣列中的初始化允許(編譯器將計數的大小):

int a[][] = {{1,2}, {1,2,3,4}, {1}}; 

這相當於:

int a[3][4] = {{1,2}, {1,2,3,4}, {1}}; 

的非常情況下 - 使用std ::向量:

std::vector<std::vector<int>> board; 
Foo(std::vector<std::vector<int>> board) : board(board) {} 

如果您不能使用std :: vector的不管是什麼原因 - 那麼唯一的解決辦法是使用int**有兩種尺寸:

int** board; 
size_t s1; 
size_t s2; 
Foo(int** board = NULL, size_t s1 = 0, size_t s2 = 0) : board(board), s1(s1), s2(s2) {} 

但要注意,你不能使用此方法:

int board[][] = {{1,1,2},{1,2,2}}; 
Foo foo((int**)board,2,3); 

,因爲你必須提供一個動態數組:

int** board = new int*[2] { new int[3]{1,1,2}, new int[3]{1,2,2}}; 

而且因爲 - 你必須實現的拷貝構造函數,賦值操作符和析構函數:

Foo(const Foo& other) : TODO { TODO } 
~Foo() { TODO } 
Foo& operator = (Foo other) { TODO } 

所以,僅僅使用std :: vector的。