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

时间:2013-04-07 00:38:15

标签: c++ arrays templates pointers

简单地说,我有一个模板类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。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

查看C FAQ

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

  

答:编译器假装数组参数被声明为指针(即,在示例中,作为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]));

答案 1 :(得分:1)

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

从C ++标准,4.2 [标准转换]

  

“N T数组”或“未知T的数组”类型的左值或右值可以转换为prvalue   类型“指针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");
    }

    ...
}

在我看来,这是一个更清洁的选择。我希望这会有所帮助。