如果我想重载运算符“>>”这是我的.h文件中的行
friend istream &operator >> (istream& input,const Money&m2);
我想要实例吗
friend istream &operator >> (istream& input,const Money&m2){
input >> m2.dollar;
return input;
}
进入我的头文件或我的类文件。如果我把它放入我的类文件中,该函数将如何被调用?这样的事情可以吗?
const Money Money::&operator >> (istream& input,const Money&m2)
班级名称是“Money.cpp”
答案 0 :(得分:3)
输入流操作符接受对非const std::istream
的引用,以及对要读取数据的非const对象的引用。您可以将其定义为类的朋友以提高效率(直接访问成员变量),但如果您已经提供了设置这些值的有效机制,则可能需要考虑是否需要一个朋友。
在下面的示例中,我定义了一个class Money
,它表示一些值(作为双精度浮点值,这是非常糟糕的,但只是一个示例)和ISO货币代码(作为的std :: string)。然后我定义了一个输入流操作符,它以“13.99 GBP”的格式读取输入,以及一个以相同格式写入值的输出流操作符。
实例:http://coliru.stacked-crooked.com/a/d3e24b4fd697f773
<强> money.hpp 强>
class Money {
public:
Money(double value, const std::string& code);
const std::string& currencyCode() const;
double value() const;
friend std::istream& operator>>(std::istream&, Money&);
private:
double value_;
std::string code_;
};
std::istream& operator>>(std::istream& in, Money& m);
std::ostream& operator<<(std::ostream& out, const Money& m);
<强> money.cpp 强>
Money::Money(double value, const std::string& code)
: value_(value), code_(code) {}
const std::string& Money::currencyCode() const {
return code_;
}
double Money::value() const {
return value_;
}
std::istream& operator>>(std::istream& in, Money &m) {
in >> m.value_ >> m.code_;
return in;
}
std::ostream& operator<<(std::ostream& out, const Money& m) {
out << m.value() << " " << m.currencyCode();
return out;
}
要记住一些要点:
如果构造函数执行一些非平凡的验证(例如检查std::string
包含有效的ISO货币代码),我们不应该通过直接读入输入流操作符中的成员变量来绕过该验证。相反,我们应该读入本地double和本地字符串,然后构造一个Money对象,将验证交给已经编写的构造函数(参见下面的示例;除了删除friend
声明之外,标题是相同的来自班级)。
实例:http://coliru.stacked-crooked.com/a/233ac7c17e51f612
money.cpp(在构造函数中验证)
Money::Money(double value, const std::string& code)
: value_(value), code_(code) {
if (code_ != "GBP") throw std::runtime_error("Must be GBP");
}
const std::string& Money::currencyCode() const {
return code_;
}
double Money::value() const {
return value_;
}
std::istream& operator>>(std::istream& in, Money &m) {
double value(0.0);
std::string code;
in >> value >> code;
m = Money(value, code);
return in;
}
std::ostream& operator<<(std::ostream& out, const Money& m) {
out << m.value() << " " << m.currencyCode();
return out;
}
答案 1 :(得分:0)
如果将其放入标题中,则函数定义中的任何更改都需要重新编译包含它的任何文件。如果你在.cpp
文件中定义它,那么你就不会这样做,链接器将对其进行排序。
答案 2 :(得分:0)
我不知道是什么困扰你,所以有这个例子,看看它是否清除了你的怀疑 在此处运行:http://ideone.com/K90L13
.h
#include <iostream>
#include <istream>
using namespace std;
class A{
int p;
public:
friend istream & operator >> (istream&,A&);
friend ostream & operator << (ostream&,A&);
};
.cpp
istream & operator >> (istream &input, A &obj){
input >> obj.p;
return input;
}
ostream & operator << (ostream &output, A &obj){
output << obj.p;
return output;
}
int main(){
A a;
cin >> a;
cout << a;
}
答案 3 :(得分:-1)
回答。
类字段中的函数名称应为
std::istream &operator >> (istream& input,const Money&m2){}