【问题标题】:How to overload += operator to return a string?如何重载 += 运算符以返回字符串?
【发布时间】:2016-10-31 20:17:29
【问题描述】:

我有一个简单的问题:如何重载 += 运算符以返回一个字符串。这是我尝试过的方法,但没有成功。

Student& Student::operator+=(const Student& RHS)
{
    string temp_string;
    temp_string = "( " + RHS.get_name() + ", " + RHS.get_grade() + ") ";
    return temp_string;
}

【问题讨论】:

  • 将返回类型更改为std::string?
  • @NathanOliver 你是怎么想到这个主意的? o_o
  • 请记住,这将是令人困惑和意想不到的。看起来您甚至没有修改当前对象。我非常建议不要这样做。
  • 并且不要返回临时引用...您正在劫持 += 运算符。不建议。
  • 在写这篇文章之前,你应该退后一步,问问自己将一个学生添加到另一个学生意味着什么。您很可能希望使用命名函数而不是这样的运算符重载。

标签: c++ overloading operator-keyword


【解决方案1】:

纯技术:

// v NO reference here!
std::string Student::operator+=(const Student& rhs)
{
    string temp_string;
    temp_string = "( " + rhs.get_name() + ", " + rhs.get_grade() + ") ";
    return temp_string;
}

但是:

这应该是什么意思?首先,一般两个学生相加的结果是什么?另一个学生?你会如何用人类语言来解释它?已经开始混乱了。那么看看下面的内容:

int x = 10;
x += 12;

您希望 x 之后保持值 22。特别是:x 被修改(除非您添加零......)。相比之下,您的操作员不会以任何方式修改this - 它甚至不会查看...您如何解释向this 添加另一个学生现在?特别是:使用运算符 + 接受两个学生,您可以返回某种配对或家庭,但是使用 +=,更改结果类型???如果x += 7 没有修改x,而是返回了一个double 怎么办?你知道这一切变得多么混乱吗?

另一方面,我可以想象,您实际上是在寻找显式转换运算符:

operator std::string()
{
    std::string temp_string;
    temp_string = "( " + this->get_name() + ", " + this->get_grade() + ") ";
    return temp_string;
}

这样,您可以将学生添加到字符串中,例如。 G。像这样:

Student s;
std::string str;
str += s;

或者您想将学生传递给输出流?那么这个:

std::ostream& operator<<(std::ostream& stream, Student const& s)
{
    stream << "( " << s.get_name() << ", " << s.get_grade() << ") ";
    return stream;
}

通过以上,您可以将强制转换运算符简化为:

operator std::string()
{
    std::ostringstream s;
    s << *this;
    return s.str();
}

甚至可以有一个班轮:

operator std::string()
{
    return static_cast < std::ostringstream& >(std::ostringstream() << *this).str();
}

好吧,承认,如果这个演员阵容真的更好,那是有争议的......

【讨论】:

  • 感谢您的反馈,我真的很感激 :) 我会调查您所说的(诚然,我不太擅长超载,所以您的解释确实很有帮助)。
  • 所以我实现了: operator std::string() { std::string temp_string; temp_string = "( " + this->get_name() + ", " + this->get_grade() + ") ";返回临时字符串;它工作得很好,但 get_grade 返回一个浮点数。任何想法如何在此上下文中将其转换为字符串?谢谢!
  • @SamTalbot std::to_string?
  • 注意 temp_string 是不必要的,你可以return "( " + ...
  • 我目前正在做的作业不会在 C++11 上评分,而是一个旧版本,我不认为它支持 to_string 不幸的是:/
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多