我试图超载< <运算符,因此当我在std :: cout中使用我的类对象时,它会打印出应该打印的数据成员。 我知道我必须在一个类中定义一个朋友函数签名,然后在课外我定义了两个朋友函数做这个工作,但我想交出这个类,并且不希望用户做任何事情我希望班级照顾一切。我如何在C++中实现这样的事情?有没有办法重载提取操作符,而不是类的朋友?
预先感谢您
我试图超载< <运算符,因此当我在std :: cout中使用我的类对象时,它会打印出应该打印的数据成员。 我知道我必须在一个类中定义一个朋友函数签名,然后在课外我定义了两个朋友函数做这个工作,但我想交出这个类,并且不希望用户做任何事情我希望班级照顾一切。我如何在C++中实现这样的事情?有没有办法重载提取操作符,而不是类的朋友?
预先感谢您
C++的友元函数被设计为允许非成员函数做的事情,会需要其他语言的成员函数。 A 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)。
非常感谢你:) – Breeze 2012-04-17 11:56:15
下面是一个例子:
#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()
非常感谢你:) 我最近试图使用boost,并在此期间,我看到很多这种重载,这使我的生活很容易,特别是当使用boost :: serialize时,然后我认为我自己,为什么我不会这自己,让我更容易? :) 是的,你是对的,我从来没有想过这个问题。我会记住这一点肯定:) 再次谢谢先生:) – Breeze 2012-04-17 11:40:52
我们通常以下列方式使用< <:
cout<<myobject;
如果你让运营商< <(),你必须使用以下语法类的成员函数 调用操作< <()
myobject<<cout;
你想用那种方式?如果它适合你,你可以使它成为一个成员函数。如果你想让它像
cout<<myobject
- 你必须让运营商< <()类
请在创建您的帖子时观察预览,然后按[{}'按钮引用源代码。 – Potatoswatter 2012-04-17 11:18:10
纠正了格式问题.. – whitetiger 2012-04-17 11:20:44
坦克:)我明白, – Breeze 2012-04-17 11:54:18
看到这个答案关于如何定义类内的朋友http://stackoverflow.com/a/2077010/597607 – 2012-04-17 11:09:05
为什么这甚至很重要?我的意思是,因为没关系(我认为),这个问题是没有用的(因此保证低估)。如果它很重要,那么知道它为什么很重要会有帮助,因为那样的话,不是试图以不可能的方式解决问题,而是尝试以其他方式实际解决问题。 – 2012-04-17 11:21:42
@ R.MartinhoFernandes我认为这是一个很好的问题,基本上他想要以不直观的方式实现ADL的功能。问题有些模糊,很难制定好。 – Potatoswatter 2012-04-17 11:32:39