将指针数组传递给模板类方法

Passing array of pointers to template class method

本文关键字:类方法 指针 数组      更新时间:2023-10-16

简单地说,我有一个模板类Tree,它有一个createTree(Data* arrayData[])方法。这个方法接收一个指向data类型数据的指针数组:

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的大小,单个值为NULL。

我做错了什么?

查看C常见问题解答

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

A:编译器假定数组形参声明为指针(在本例中为char * A;(参见问题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]));

tab被发送到函数中时,它将进行数组到指针的转换:

来自c++标准,4.2[标准转换]

类型为"N - T的数组"或"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");
    }
    ...
}

在我看来这是一个更干净的选择。我希望这对你有帮助。