我正在尝试重载 << 运算符,以便当我在 std::cout 中使用我的类对象时,它会打印出应该打印的数据成员。我知道我必须在一个类内部定义一个友元函数签名,然后在类外部定义两个友元函数来完成这项工作,但我想交出这个类,并且不希望用户做任何事情,我想让班级照顾好一切。我怎样才能在 C++ 中实现这样的事情?
先感谢您
我正在尝试重载 << 运算符,以便当我在 std::cout 中使用我的类对象时,它会打印出应该打印的数据成员。我知道我必须在一个类内部定义一个友元函数签名,然后在类外部定义两个友元函数来完成这项工作,但我想交出这个类,并且不希望用户做任何事情,我想让班级照顾好一切。我怎样才能在 C++ 中实现这样的事情?
先感谢您
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 */
虽然这个微妙的规则起初很奇怪,但它反映了非成员函数也可以被类封装的想法。
有关更多信息,请阅读与参数相关的查找(ADL)。
我们通常以如下方式使用<<:
cout<<myobject;
如果您将 operator<<() 设为类的成员函数,则必须使用以下语法来调用 operator<<()
myobject<<cout;
你想要那样吗?如果它适合您,您可以将其设为成员函数。
如果你想要它
cout<<myobject
- 你必须让 operator<<() 成为你班级的朋友功能
这是一个例子:
#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;
}
但是,根据我的经验,不要那样做。超载在学术上很好,但它使搜索应用程序的实现变得困难,甚至无法理解 << 已被重载。我总是使用某种形式的东西cout << myobject.tostring()