0

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

先感谢您

4

3 回答 3

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 */

虽然这个微妙的规则起初很奇怪,但它反映了非成员函数也可以被类封装的想法。

有关更多信息,请阅读与参数相关的查找(ADL)。

于 2012-04-17T11:29:18.283 回答
0

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

cout<<myobject;

如果您将 operator<<() 设为类的成员函数,则必须使用以下语法来调用 operator<<()

myobject<<cout;

你想要那样吗?如果它适合您,您可以将其设为成员函数。

如果你想要它

cout<<myobject 

- 你必须让 operator<<() 成为你班级的朋友功能

于 2012-04-17T11:17:12.197 回答
-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()

于 2012-04-17T11:11:29.140 回答