Tre*_*key 5 c++ pointers class operator-overloading c++11
在我的班级中,我有一个成员变量std::vector<node*>子项
我想重载下标运算符,以便我可以轻松索引其中一个节点.
这是我的班级减速功能:
node* operator[](int index);
Run Code Online (Sandbox Code Playgroud)
这是我对该函数的类定义:
node* class_name::operator[](int index){
return children[index];
}
Run Code Online (Sandbox Code Playgroud)
但是,这个函数似乎没有像我希望的那样返回指针.
这是给我带来麻烦的功能:
void Print_Tree(node* nptr, unsigned int & depth){
if (NULL == nptr) {
return;
}
//node display code
for (int i = 0; i < nptr->Number_Of_Children(); ++i){
Print_Tree(nptr[i],depth+1); //<- Problem Here!
}
//node display code
return;
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
错误:在递归调用时无法将"node"转换为"node*"
我不明白为什么当我想要一个指向节点的指针时它会给我一个节点.
我的重载功能有问题吗?
我尝试在递归调用中取消引用该节点:
Print_Tree(*nptr[i],depth+1);
Print_Tree(*(nptr[i]),depth+1);
Print_Tree(nptr->[i],depth+1);
Run Code Online (Sandbox Code Playgroud)
无济于事!
我究竟做错了什么?
您正在寻找正确位置的问题,但三次修正尝试的语法仍然有些错误.
nptr是指向Node对象的指针,因此您无法直接应用索引运算符(如果这样做,编译器将假定它指向Node数组的开头并跳转到第i个条目).
相反,您需要首先取消引用指针,然后应用索引运算符.使用括号来确定此顺序:
Print_Tree((*nptr)[i],depth+1);
Run Code Online (Sandbox Code Playgroud)
另外,您使用intas作为向量索引的数据类型略有不正确.更好用std::size_t或std::vector<Node*>::size_type.
此外,鉴于这个问题被标记为c ++ 11,我应该指出,引用空指针的正确方法nullptr不是NULL.