过载下标运算符不返回指针

时间:2012-09-16 07:19:29

标签: c++ class pointers c++11 operator-overloading

在我的班上,我有一个成员变量std::vector<node*>孩子 我想重载下标运算符,以便我可以轻松索引其中一个节点。


这是我的班级减速功能:

node* operator[](int index);  

这是我对该函数的类定义:

node* class_name::operator[](int index){

    return children[index];
}  

然而,这个功能似乎没有像我希望的那样返回指针 这是给我带来麻烦的功能:

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;
}  

我得到的错误是:

  

错误:无法在递归调用上将'node'转换为'node *'

我不明白为什么当我想要一个指向节点的指针时它会让我回到一个节点 我的重载功能有问题吗?
我尝试在递归调用中取消引用该节点:

Print_Tree(*nptr[i],depth+1);  
Print_Tree(*(nptr[i]),depth+1);
Print_Tree(nptr->[i],depth+1);

无济于事!

我做错了什么?

2 个答案:

答案 0 :(得分:7)

您正在寻找正确位置的问题,但三次修正尝试的语法仍然有些错误。

nptr是指向Node对象的指针,因此您无法直接应用索引运算符(如果这样做,编译器将假定它指向Node数组的开头并跳转到第i个条目。)

相反,您需要首先取消引用指针,然后应用索引运算符。使用括号确定此顺序:

Print_Tree((*nptr)[i],depth+1);

另外,您使用int作为向量索引的数据类型略有不正确。更好地使用std::size_tstd::vector<Node*>::size_type


此外,鉴于此问题已标记为,我应该指出引用空指针的正确方法是nullptr,而不是NULL

答案 1 :(得分:1)

即使让operator[]返回指针确实合法,但更好的设计(并符合标准类的期望)来返回引用。然后,您可以按如下方式获取该引用的地址:

node& class_name::operator[](int index){
    return *(children[index]);
}

然后将其用作:

Print_Tree(&(*nptr)[i],depth+1);