2014-11-04 58 views
0

在主我可以在函數內部指針數組:如何創建,其大小是未知的,直到運行時間

Node* myNodeArray2[myHeight][myWidth];//Does not call constructor 

for(int i=0; i<myHeight; i++){ 
    for(int j=0; j<myWidth; j++){ 
     theNodeArray[i][j] = new Node("ThisIsTest", 5, 5); 
    } 
} 

因此,對於上面的代碼myHeight和myWidth可以是在運行時的用戶輸入。它不調用默認構造函數,我可以使用new運算符並遍歷數組創建對象。

我希望能夠到節點* myNodeArray2傳遞給一個函數,讓它創建數組的大小和填充它。當它被創建時,我希望元素是指針。我不想調用默認的構造函數。我希望能夠在我選擇時使用非默認構造函數調用new運算符。

當我嘗試:

void Test(Node*& theNodeArray, int myHeight, int myWidth){ 
    theNodeArray = new Node*[myHeight][myWidth]; 

} 

int main(){ 
    Node* myNodeArray; 
    Test(myNodeArray, myHeight, myWidth); 

} 

我得到

「myWidth不是一個常量表達式。」

我嘗試了幾種不同的方法,但不能得到我想要的。我需要創造發生在一個單獨的功能。我需要能夠在運行時定義大小。任何幫助?

編輯:

我不想使用std :: vector。

編輯2:

我不想做這個

int** ary = new int*[sizeX]; 
for(int i = 0; i < sizeX; ++i) 
    ary[i] = new int[sizeY]; 

由於這迫使行是連續的內存空間物體。我想分配一個2d指針數組。我不想一定要創建將被指向的對象。

+1

爲什麼你不希望使用'VECTOR'? – Jay 2014-11-04 19:54:04

+0

代碼將被用於C門控不支持向量的自定義HDL。 – NDEthos 2014-11-04 19:55:36

+2

如果您不能使用[tag:C++],請將標籤更改爲[tag:c]。 – Jarod42 2014-11-04 19:57:25

回答

1

您可以使用以下方法:

Node*** MakeArrayNodePtr(int myHeight, int myWidth){ 
    Node*** res = new Node**[myHeight]; 
    for (int i = 0; i != myHeight; ++i) { 
     res[i] = new Node*[myWidth](); 
    } 
    return res; 
} 

而且不要忘記

void DeleteArrayNodePtr(Node*** nodes, int myHeight, int myWidth) 
{ 
    for (int i = 0; i != myHeight; ++i) { 
     // And probably: 
     /* 
     for (int j = 0; j != myWidth; ++j) { 
      delete nodes[i][j]; 
     } 
     */ 
     delete [] nodes[i]; 
    } 
    delete [] nodes; 
} 
+0

這看起來很有希望。將現在與它合作,並回來! – NDEthos 2014-11-04 20:07:57