【问题标题】:Using overloaded << operator with pointer of class使用带有类指针的重载 << 运算符
【发布时间】:2014-11-29 21:48:49
【问题描述】:

我正在定义一个 LinkedList 类,它使用单独定义的 Node 类。每个节点都有一个指向下一个节点的指针。

在 Node 类中,我有 friend ostream&amp; operator&lt;&lt;(ostream&amp; ostr, const Node&lt;T&gt;&amp; m);

在 LinkedList 类中,我有 head,它是指向第一个 Node 的指针。

如何为 LinkedList 定义一个打印函数,该函数将迭代地调用列表中每个节点的重载

void LinkedList::print() {
  Node* search = head;
  while(search) {
    cout << //print stuff here
    search = search->getNext();
  }
  cout << endl;
}

【问题讨论】:

  • cout &lt;&lt; *search; 工作吗?
  • 试过了,没用。
  • Wimmel 所说的应该有效,所以我们需要更多关于“无效”的信息。
  • 你的 Node 类是否模板化了?从您的 operator
  • 我为迟到的回复道歉,它是模板化的,我提供的代码只是我所拥有的代码的简化。当我做 cout

标签: c++ operator-overloading


【解决方案1】:

首先我想向您推荐一个成熟的问题:

Operator overloading on class templates

其次,我想出了一些东西:

通过写作:

friend ostream&amp; operator&lt;&lt;(ostream&amp; ostr, const LinkedList&lt;T&gt;&amp; m);

在类声明中,您通知编译器您将使用运算符

请注意,它是一个全局函数,而不是类方法。

我还“修复”了您代码中的两个错误。函数声明中的一个,其中LinkedList 应该是一个参数。直观 => 因为您要打印列表而不是节点。

第二个是第一行,你必须在其中获取 m 的head 成员的地址。在您的“C'ish”实现中,这是必要的。

ostream& operator<<(ostream& ostr, const LinkedList<T>& m) {
Node* search = &(m.head); // You have to take the adrress of the head
while(search) {
   ostr << //print stuff here
   search = search->getNext();
}
ostr << endl;
return ostr;
}

返回流可能看起来很奇怪,但它实际上在如下语句中是有意义的:

LinkedList<Banana> bananas;
LinkedList<Apple> apples;

cout << bananas << apples;

因为bananas 获取cout,使用它,然后returns 它被apples 使用。

希望我没有混淆太多或犯任何错误。

【讨论】:

  • 感谢您的帮助。我试图实现的是重载 Node 类中的 cout << node_ptr 的方式打印节点
  • 哦,我在考虑你是否是这个意思。在这种情况下,它会变得更有趣。
  • 这就是我问的原因哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多