【问题标题】:Overloading '<' Operator Breaks << for cout?重载 '<' 运算符中断 << 用于 cout?
【发布时间】:2013-05-31 21:59:57
【问题描述】:

我已经定义了一个 Player 类来做一些操作,所以我可以方便地重载一些基本的操作符。具体来说,我想使用

bool operator<(const Player& rhs) const {return (*this < rhs );} 

不幸的是,这导致了问题。后来,当我尝试在 main 函数中输出包含特定元素的向量时,编译器让我知道

vector<Player> playerVec(6);

for (int i = 0; i < 6; i++) {

cout << playerVec[i];

}

请注意,我实际上并不想将任何 Player 对象直接输出到流,所以我认为我不需要重载

我对正在发生的事情有所了解,因为编译器采用了我对

感谢您提供的任何帮助!

【问题讨论】:

  • 请给我们看代码。
  • 这不是无限递归吗?
  • 如果你想输出你的对象,你应该重载
  • operator&lt; 的存在完全operator&lt;&lt; 的不存在无关(根据您的编译器,这实际上是您的问题)。跨度>
  • 如果您不尝试将Player 对象输出到流中,那么此语句的意图是什么:cout &lt;&lt; playerVec[i];?因为这正是试图将 Player 对象输出到流中的样子。

标签: c++ class operator-overloading


【解决方案1】:

我猜你正在处理两个不同的问题:

1) 您缺少std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Player&amp;),这是您将Player 对象流式传输到std::cout 和其他输出流所需要的

2) 您的Player 小于比较运算符&lt; 中有一个无限递归,因为您提供的运算符会调用自己。

【讨论】:

  • 1) 但是,我并没有尝试将 Player 对象输出到流中,所以我没有重载
  • @Rome_Leader 1) 输出向量是什么意思?您的代码字面意思是流播放 Player 对象。 2) 你比较你认为合适的 Player 对象的成员。例如:return id == rhs.id;
  • @Rome_Leader:为了输出Player的容器(向量),你必须能够输出一个单独的Player。输出Player 的向量时,你期待什么?
  • 对不起,我想我没有意识到将我的向量设为 Player 类型的含义。截至目前,我只是想输出比较的值,所以我想一个整数向量就可以了。
【解决方案2】:

我不认为,您的 operator&lt;() 会干扰。根据您的代码的复杂性,您可以通过简单地对其进行注释来验证这一点并检查您是否遇到相同的错误。

您需要指定一个std::ostream &amp; operator&lt;&lt;(std::ostream &amp; os, const Player &amp; p) 非成员函数,否则编译器不知道如何编写类似os &lt;&lt; myPlayer 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多