有没有办法在类中重载提取操作符而不是类的朋友?

时间:2012-04-17 11:03:59

标签: c++ operator-overloading friend-function

我正在尝试重载<<运算符,这样当我在std :: cout中使用我的类对象时,它会打印出应该打印的数据成员。 我知道我必须在类中定义一个朋友函数签名,然后在类之外定义两个完成这项工作的朋友函数, 但我想交出课程,并且不希望用户做任何事情,我希望课程照顾一切。 我怎样才能在c ++中实现这样的目标?

提前谢谢

3 个答案:

答案 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()

形式的东西