我正在尝试重载<<运算符,这样当我在std :: cout中使用我的类对象时,它会打印出应该打印的数据成员。 我知道我必须在类中定义一个朋友函数签名,然后在类之外定义两个完成这项工作的朋友函数, 但我想交出课程,并且不希望用户做任何事情,我希望课程照顾一切。 我怎样才能在c ++中实现这样的目标?
提前谢谢
答案 0 :(得分:1)
C ++旨在允许非成员函数执行需要其他语言的成员函数的操作。 friend
函数与成员函数非常相似,因为它可以在类范围内定义。另外(这可能会令人困惑)如果在类范围内声明friend
函数 ,只能通过将该类的对象传递给它来访问它。
struct printme {
friend std::ostream &operator<< ( std::ostream &os, printme const & )
{ return os << "hello"; }
friend void named_friend( printme const & ) {}
};
std::cout << printme(); // OK
named_friend( printme() ); // OK
void (*fn_ptr) = named_friend; /* function not found
it can only be found by association with printme */
虽然这个微妙的规则起初很奇怪,但它反映了非成员函数也可以被类封装的想法。
有关详细信息,请阅读argument-dependent lookup(ADL)。
答案 1 :(得分:0)
我们通常使用&lt;&lt;通过以下方式:
cout<<myobject;
如果您将运算符&lt;&lt;()成为类的成员函数,则必须使用以下语法 调用运算符&lt;&lt;()
myobject<<cout;
你想要那样吗?如果它对你好,你可以使它成为一个成员函数。
如果你想要它
cout<<myobject
- 你必须使operator&lt;&lt;()成为你班级的朋友功能
答案 2 :(得分:-1)
以下是一个例子:
#include <iostream>
#include <string>
using namespace std;
class A {
public:
string pr() { return "Hi, I'm class A"; }
};
ostream &operator << (ostream &o, const A &a) {
o << a.pr();
return o;
}
int main() {
A a;
cout << a << endl;
return 0;
}
但是,根据我的经验,不要这样做。开发在学术上很不错,但是它使搜索应用程序的实现变得困难,甚至理解&lt;&lt;已超载。我总是使用cout << myobject.tostring()