2013-04-07 89 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"); 
    } 

    ... 
} 

这在我看来是一个更清洁的替代。我希望这有助于。