c++ 有没有一种方法可以重载提取操作符,在类内部而不是作为类的朋友?

6jygbczu  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(123)

我试图重载〈〈操作符,这样当我在std::cout中使用我的类对象时,它会打印出应该打印的数据成员。
我知道我必须在类内部定义一个友元函数签名,然后在类外部定义两个友元函数来完成这项工作,但我想把类交给用户,不希望用户做任何事情,我希望类能处理好一切。
如何在C++中实现这样的功能?

0ejtzxu1

0ejtzxu11#

C++被设计成允许非成员函数做一些在其他语言中需要成员函数的事情。friend函数与成员函数非常相似,因为它可以在类作用域中定义。另外(这可能会令人困惑)如果你 only 在类作用域中声明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)。

6yt4nkrj

6yt4nkrj2#

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

cout<<myobject;

如果你让operator〈〈()成为你类的成员函数,你必须使用以下语法来调用operator〈〈()

myobject<<cout;

你想这样做吗?如果它对你没问题,你可以让它成为一个成员函数。
如果你想要

cout<<myobject
  • 你必须让operator〈〈()成为你类的友元函数
pxiryf3j

pxiryf3j3#

下面是一个例子:

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

然而,根据我的经验,不要这样做。Oveloading在学术上是不错的,但是它使搜索应用程序以寻找其实现变得困难,甚至理解〈〈已经被重载。我总是使用cout << myobject.tostring()形式的东西

相关问题