我只是有一个简单的问题:如何重载+ =运算符以返回字符串。这是我尝试过的,但没有成功。
// 'Student' is the class that this function is in
// 'get_name()' returns the name of the student
// 'get_grade()' returns the grade of the student
// Description:
// Ultimately I will be creating a list of students and their grades in
// the format of (Student1, Grade1) (Student2, Name2) ... (StudentN, GradeN)
// in a higher level class, and thus I need an overloaded += function.
Student& Student::operator+=(const Student& RHS)
{
string temp_string;
temp_string = "( " + RHS.get_name() + ", " + RHS.get_grade() + ") ";
return temp_string;
}
答案 0 :(得分:7)
纯技术:
// 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;
}
<强> BUT: 强>
这是什么意思?首先,一般两个学生的总和结果是什么?另一个学生?你会如何解释人类语言?开始让人困惑。然后看看以下内容:
int x = 10;
x += 12;
您希望x
之后保持值22.特别是:x被修改(除非您添加了零...)。相比之下,您的运营商不会以任何方式修改this
- 它甚至没有看到......您如何解释将另一位学生添加到this
现在?特别是:有一个操作员+接受两个学生,你可以返回某种对或家庭,但用+ =,改变结果类型???如果x += 7
没有修改x,但返回了双倍,该怎么办?你觉得这一切有多混乱吗?
另一方面,我可以想象,你实际上是在寻找显式的强制转换运算符:
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();
}
嗯,承认,如果真的更好,这种演员必须是有争议的......