2013-04-07 93 views
1

簡而言之,我有一個模板類樹,它有一個createTree(Data* arrayData[])方法。這個方法接收的指針數組到類型數據的數據:傳遞指向模板類方法的指針數組

template<class Data> 
void Tree<Data>::createTree(Data* arrayData[]) { 
    m_indexCreation = 0; 
    cout << sizeof(arrayData)/sizeof(int) << endl; 
    m_root = createChildTree(arrayData); 
} 

以我main()功能,創建指針數組到字符串對象,並填充它。然後我嘗試將它傳遞給createTree()方法,但在該方法內數組變成了大小1.換句話說,方法內部的計數打印爲「1」。 這裏是我的main()

int main() { 
    string* tab[20]; 

    for (int i = 0 ; i < 20 ; i++) { 
     if (i % 3 != 0) { 
      tab[i] = new string("James Johnson"); 
     } else { 
      tab[i] = NULL; 
     } 
    } 

    Tree<string> tree; 
    tree.createTree(tab); 

    tree.display(tree.getRoot()); 
} 

我可以毫無問題地打印在main()整個陣列的值,但在createTree(),數組莫名其妙地減少了尺寸爲1,與空的單值。

我在做什麼錯?

+0

'sizeof(tabDonnees)/ sizeof(int)'可能產生1.您將指針的大小除以int的大小。另外,creerArbre(createTree)方法不能確定'tab'的大小,它只能通過地址傳遞,並且不會存儲它的大小,也不會通過編譯器的大小。 – 2013-04-07 00:45:56

+0

@Alexis Leclerc,您好,亞歷克西斯,歡迎來到SO。請考慮到SO的大部分用戶都是全球開發人員。發佈法語,西班牙語,印度語或德語,或阿拉伯語或任何其他語言的代碼是個不錯的主意。我翻譯了它。 – 2013-04-07 00:48:36

+0

@StephaneRolland - 重要嗎?他的問題本身是英文的。只有類名,函數名使用不同的語言。並沒有關係。 – user93353 2013-04-07 01:10:50

回答

1

檢查C FAQ

http://c-faq.com/aryptr/aryparmsize.html

答:編譯器假裝數組參數被聲明爲指針(即,在該示例中,爲char *一個;參見問題6.4) ,sizeof報告指針的大小。另見問題1.24和7.28。

解決方法。將大小作爲參數傳遞。

void Tree<Data>::createTree(Data* arrayData[], int sz) 
{ 
    ... 
} 

Tree<string> tree; 
tree.createTree(tab, sizeof(tab)/sizeof(tab[0])); 
+0

這似乎工作到目前爲止,非常感謝! – 2013-04-07 01:29:33

1

tab送入它將經歷函數數組到指針轉換:

從C++標準,4.2 [標準換算]

左值或類型的右值可以將「NT的數組」或「T的未知界限的數組」轉換爲類型「指向T的指針」的預值 。結果是一個指向數組的第一個元素的指針。

因此,你的初始簽名將類似於此:

Tree<Data>::createTree(Data** arrayData); 

正如你可以看到arrayData因爲雙指針。當您使用sizeof時,它將返回指針的字節數,但不返回實際陣列的字節數。爲了解決這個問題,你應該通過引用傳遞數組:

template <class Data, unsigned N> 
createTree(Data* (&arrayData)[N]); // you can print out N for the size 
//         but sizeof(x)/sizeof(*x) will still work 

或者你可以用std::vector,因爲它是非常容易得到大小:

#include <vector> 

void Tree<Data>::createTree(std::vector<Data*> arrayData) 
{ 
    std::cout << arrayData.size(); 
} 

int main() 
{ 
    std::vector<std::string> tab; 

    for (int i = 0; i < 20; ++i) // shortened for this example 
    { 
     tab[i] = new std::string("James Johnson"); 
    } 

    ... 
} 

這在我看來是一個更清潔的替代。我希望這有助於。