2 qwertyuiop1321 qwertyuiop1321 于 2017.08.07 17:12 提问

c++中给两个不同的类声明同一个友元函数

一名c++初学者,课本上一道关于友元函数的练习题让我不明白。
题目:定义Boat与Cat两个类,二者都有weight属性,定义二者的友元函数getTol(),计算二者的重量和。
我第一次写的代码是下面这样的,但是显示Car类的私有数据weight无法访问,编译也通过不了
图片说明
之后将getTol()函数的形参去掉,发现没有任何问题了,编译也可以通过,如下图是:
图片说明
(我用的编译器是VS2015)

哪位大咖帮我解释一下这两者的区别或者给我建议一个好的方案。
这里多谢啦。

4个回答

fight_in_dl
fight_in_dl   Ds   Rxr 2017.08.08 21:14
已采纳

两个类共享同一个友元函数是可以的,友元函数有没有参数并不影响。
正确的做法如下,关键处有注释:

#include <iostream>
using namespace std;

class Boat;   //类前向声明,否则Boat类在Car类中不可见。

class Car {
private:
    int weight;
public:
    Car() {
        weight = 100;
    }
    friend void getTol(Boat &b, Car &c);
};

class Boat {
private:
    int weight;
public:
    Boat() {
        weight = 100;
    }
    friend void getTol(Boat &b, Car &c);
};

void getTol(Boat &b, Car &c) {
    cout << (b.weight + c.weight);
}

int main() {
    Boat B1; //需要创建类实例
    Car C1;  //需要创建类实例
    getTol(B1, C1);
    return 0;
}

楼主可以测试运行此代码以增加体会。

如果对您有帮助,请采纳答案好吗,谢谢!

nuptmahaibin
nuptmahaibin 这个才是问题的原因,编译器报的bug不对,应该报class Car类中friend void getTol(Boat &b, Car &c);这行的'Boat' has not been declared才对
8 天之前 回复
caozhy
caozhy   Ds   Rxr 2017.08.07 17:37

void getTol写在外面,你得写
void Boat::getTol

qq_38204686
qq_38204686   2017.08.07 18:42

像我以前遇到的一个问题
定义俩个类 俩个类互相调用 网上解决方法还满多的

不一定非要写在类里吧 感觉为了用私有变量强行声明了俩个类的友元好别扭
你想在一个函数中调用俩个类的数据
1.变量变成public
2.写get方法
3.两个类相似 写一个基类(父类) 声明一个友元即可

qq_38204686
qq_38204686 回复机智的小y: 楼上解决了俩个类相互调用的问题 百度也有很多 你可以自己搜一搜
8 天之前 回复
qq_38204686
qq_38204686 回复机智的小y: 是呀
8 天之前 回复
m0_37393277
m0_37393277 回复das白: 写get方法是写get函数返回私有变量值吗?
8 天之前 回复
qq_38204686
qq_38204686 第三个方法不行 友元类无法被继承
10 天之前 回复
m0_37393277
m0_37393277   2017.08.09 10:47

写get方法是写get函数返回私有变量值吗?

Csdn user default icon
上传中...
上传图片
插入图片