2012-04-17 38 views
0

我试图超载< <运算符,因此当我在std :: cout中使用我的类对象时,它会打印出应该打印的数据成员。 我知道我必须在一个类中定义一个朋友函数签名,然后在课外我定义了两个朋友函数做这个工作,但我想交出这个类,并且不希望用户做任何事情我希望班级照顾一切。我如何在C++中实现这样的事情?有没有办法重载提取操作符,而不是类的朋友?

预先感谢您

+0

看到这个答案关于如何定义类内的朋友http://stackoverflow.com/a/2077010/597607 – 2012-04-17 11:09:05

+0

为什么这甚至很重要?我的意思是,因为没关系(我认为),这个问题是没有用的(因此保证低估)。如果它很重要,那么知道它为什么很重要会有帮助,因为那样的话,不是试图以不可能的方式解决问题,而是尝试以其他方式实际解决问题。 – 2012-04-17 11:21:42

+0

@ R.MartinhoFernandes我认为这是一个很好的问题,基本上他想要以不直观的方式实现ADL的功能。问题有些模糊,很难制定好。 – Potatoswatter 2012-04-17 11:32:39

回答

1

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)。

+0

非常感谢你:) – Breeze 2012-04-17 11:56:15

-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; 
} 

但是,从我的经验,不这样做。开发在学术上很好,但它会让你搜索你的应用程序来执行它,甚至理解< <已被超载。我总是用形式的东西cout << myobject.tostring()

+0

非常感谢你:) 我最近试图使用boost,并在此期间,我看到很多这种重载,这使我的生活很容易,特别是当使用boost :: serialize时,然后我认为我自己,为什么我不会这自己,让我更容易? :) 是的,你是对的,我从来没有想过这个问题。我会记住这一点肯定:) 再次谢谢先生:) – Breeze 2012-04-17 11:40:52

0

我们通常以下列方式使用< <:

cout<<myobject; 

如果你让运营商< <(),你必须使用以下语法类的成员函数 调用操作< <()

myobject<<cout; 

你想用那种方式?如果它适合你,你可以使它成为一个成员函数。如果你想让它像

cout<<myobject 

- 你必须让运营商< <()类

+0

请在创建您的帖子时观察预览,然后按[{}'按钮引用源代码。 – Potatoswatter 2012-04-17 11:18:10

+0

纠正了格式问题.. – whitetiger 2012-04-17 11:20:44

+0

坦克:)我明白, – Breeze 2012-04-17 11:54:18

相关问题