【问题标题】:overload subscript operator does not return pointer重载下标运算符不返回指针
【发布时间】:2012-09-08 20:00:33
【问题描述】:

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


这是该功能的班级减速:

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

无济于事!

我做错了什么?

【问题讨论】:

  • (*nptr)[i] 应该可以解决问题。问题是您将operator[] 定义为在node 类上工作,而不是在指向 node 的指针上工作。当你说nptr[i] 时,你调用的是内置的operator[]
  • 哦!现在非常明显。谢谢

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


【解决方案1】:

您在正确的地方寻找问题,但您的三次更正尝试中的语法仍然略有错误。

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

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

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

另外,您使用int 作为向量索引的数据类型有点不正确。最好使用std::size_tstd::vector&lt;Node*&gt;::size_type


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

【讨论】:

  • 使用int 并不是“有点不正确”。如果你愿意,你可以提倡std::size_t,但你卖的是int
  • @LucDanton 你说的“卖空”是什么意思?
  • @LucDanton std::vector&lt;&gt;::operator[] 需要 std::vector&lt;&gt;::size_type,所以应该使用它。
  • 有符号与无符号类型是一个很容易引发激烈争论的老话题。我宁愿不提它,但同时我宁愿不让任何人印象使用std::size_t/size_type 是自动正确的做法。 intstd::ptrdiff_t/difference_type 肯定各有千秋。我把它留在那里。
  • 哦!语法错误。现在这是有道理的——我明白为什么了。使用 nullptr 因为它更安全。明白了。这篇文章:stackoverflow.com/questions/918567/size-t-vs-containersize-type 说 container::size_type 的可移植性更好,但我从未听说过 std::ptrdiff_t/difference_type。这只是我的代码中的一个小问题,但需要研究一下。谢谢大家。
【解决方案2】:

尽管让operator[] 返回一个指针确实是合法的,但最好的设计(并且符合标准类的期望)改为返回一个引用。然后,您可以按如下方式获取该引用的地址:

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

然后将其用作:

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

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多