10

朋友函数应该可以访问一个类的私有成员吧?那么我在这里做错了什么?我已经将我的 .h 文件包含在 operator<< 我打算与班级交朋友。

#include <iostream>

using namespace std;
class fun
{
private:
    int a;
    int b;
    int c;


public:
    fun(int a, int b);
    void my_swap();
    int a_func();
    void print();

    friend ostream& operator<<(ostream& out, const fun& fun);
};

ostream& operator<<(ostream& out, fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}
4

3 回答 3

13

在这里...

ostream& operator<<(ostream& out, fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}

你需要

ostream& operator<<(ostream& out, const fun& fun)
{
    out << "a= " << fun.a << ", b= " << fun.b << std::endl;

    return out;
}

(我已经被这个无数次咬过;你的运算符重载的定义与声明不完全匹配,所以它被认为是一个不同的函数。)

于 2010-07-17T10:24:16.420 回答
6

签名不匹配。你的非成员函数需要 fun& fun,声明的朋友需要 const fun& fun。

于 2010-07-17T10:24:29.663 回答
0

您可以通过在类定义中编写友元函数定义来避免这些类型的错误:

class fun
{
    //...

    friend ostream& operator<<(ostream& out, const fun& f)
    {
        out << "a= " << f.a << ", b= " << f.b << std::endl;
        return out;
    }
};

缺点是每次调用operator<<都是内联的,这可能导致代码膨胀。

(另请注意,不能调用参数,fun因为该名称已表示类型。)

于 2010-07-17T10:42:29.517 回答