所以我正在编写我的c ++家庭作业,最后一部分是他希望我们用重载的输出/插入操作符替换格式化的输出方法(toString)。要100%诚实,我不知道他的意思是什么。我已经搜索了一下并使用重载的插入运算符找到了示例代码,但似乎无法找到如何将其合并到我的代码中。虽然我想我可能在错误的地方看。我的toString如下:
string Movie::toString() const {
ostringstream oS;
oS << "\n\n====================== Movie Information\n"
<< "\n Movie Title:\t" << title << " (" << releaseYear << ")"
<< "\n US Rank & Box Office:\t" << usRank << "\t$" << usBoxOffice
<< "\nNon-US Rank & Box Office:\t" << nonUSRank << "\t$" << nonUSBoxOffice
<< "\n World Rank & Box Office:\t" << worldRank << "\t$" << worldBoxOffice
<< "\n";
return oS.str();
}
就像我提到的那样,我不确定“超载”是什么意思,所以如果由于某种原因这不足以让你直接帮我解决这个问题,那么你能不能给我一个简短的描述呢?表示通过使用重载输出运算符替换当前输出。谢谢
编辑:这是我的下一个问题。 https://stackoverflow.com/questions/14924621/c-overloaded-output-operator-cont
答案 0 :(得分:4)
重载函数意味着提供具有相同名称但不同参数类型的其他函数。运营商也可能超载。许多运算符都有一个可以重载的相应函数,称为operator??
,其中??
是运算符本身。例如,如果您有两个类x
的{{1}}和y
对象,则可以重载T
。重载运算符允许您为使用该类型的运算符赋予一些含义。所以现在你可以做operator+
。
流插入运算符为x + y
。这是您<<
时使用的内容 - 它插入到流中。这个运算符也可以重载,就像上面std::cin << "hello";
重载一样。您需要重载的函数称为+
。
有两种方法可以重载二进制运算符,如operator<<
(二进制运算符,因为它需要两个操作数,一个在左侧,一个在右侧,<<
)。一种方法是使其成为left << right
类型的成员,并为其提供left
类型的单个参数。另一种是使它成为具有两个参数的非成员函数,一个是right
的类型,另一个是left
的类型。由于right
的类型为left
,因此您无法修改该类(因为它是由标准提供的),因此您必须使用选项二。
所以你的自由功能需要看起来像这样:
std::ostream
现在只要您std::ostream& operator<<(std::ostream& os, const Movie& movie) {
// Insert everything you want into `os`
return os;
}
左侧有<<
而右侧有std::ostream
,就会调用此函数。
答案 1 :(得分:2)
我认为您的任务是编写一个重载的operator <<
,它允许您将对象的字符串表示形式写入输出流:
std::ostream& operator <<(std::ostream& os, const Movie& movie) {
os << "\n\n====================== Movie Information\n"
<< "\n Movie Title:\t" << movie.title << " (" << movie.releaseYear << ")"
<< "\n US Rank & Box Office:\t" << movie.usRank << "\t$" << movie.usBoxOffice
<< "\nNon-US Rank & Box Office:\t" << movie.nonUSRank << "\t$" << movie.nonUSBoxOffice
<< "\n World Rank & Box Office:\t" << movie.worldRank << "\t$" << movie.worldBoxOffice
<< "\n";
return os;
}
您可以像使用内置类型一样使用此运算符:
Movie m;
// Do something with m
cout << m; // Write m to the standard output