将指针数组传递给模板类方法
Passing array of pointers to template class method
简单地说,我有一个模板类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.htmlA:编译器假定数组形参声明为指针(在本例中为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");
}
...
}
在我看来这是一个更干净的选择。我希望这对你有帮助。
相关文章:
- 如何访问由共享指针保存的类方法?
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将一个类的方法指针存储到另一个类中
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 类方法返回指向具有模板的类成员的指针
- 指向类方法调用的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- C++ - 类方法函数指针unordered_map的初始化器列表
- 如何定义和设置指向模板类方法的功能指针
- 如何在没有虚拟方法的类dynamic_cast指针?
- 将指针传递到类方法
- C++ - 基类函数指针调用的替代方法
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 如何调用返回类方法指针的类方法
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 尝试获取类方法指针时出现E_NOINTERFACE
- 指向方法父参数c++的子类方法指针
- 给出一个闭包作为"类方法指针"?
- 静态类方法指针数组的正确语法