C++ 友元函数不起作用,在此上下文中为私有错误

Posted

技术标签:

【中文标题】C++ 友元函数不起作用,在此上下文中为私有错误【英文标题】:C++ friend function not working, private within this context error 【发布时间】:2012-11-20 07:57:18 【问题描述】:

我一直在为我的编程课程做一个练习,而我现在正在练习的是关于朋友函数/方法/类的练习。我遇到的问题是我的朋友功能似乎没有做它的工作;我在代码中遇到“[变量名] 在此上下文中是私有的”错误,我试图访问友元函数应该有权访问的变量。

这是头文件中的类定义(我删掉了不必要的东西以节省空间)。

class Statistics 
private: // The personal data.
PersonalData person;

public:
Statistics();
Statistics(float weightKG, float heightM, char gender);
Statistics(PersonalData person);
virtual ~Statistics();

...

friend bool equalFunctionFriend(Statistics statOne, Statistics statTwo);
friend string trueOrFalseFriend(bool value);
;

这是出现错误的方法。

bool equalFuntionFriend(Statistics statOne, Statistics statTwo)

// Check the height.
if (statOne.person.heightM != statTwo.person.heightM)
    return false;

// Check the weight.
if (statOne.person.weightKG != statTwo.person.weightKG)
    return false;

// Check the gender.
if (statOne.person.gender != statTwo.person.gender)
    return false;

// If the function hasn't returned false til now then all is well.
return true;

所以,我的问题是:我做错了什么?

编辑:问题已由 Angew 解决。看来这只是一个错字……我太傻了!

【问题讨论】:

你的函数也是PersonalData的朋友吗? 第二个代码示例中有错字,缺少c(只是equalFuntionFriend)。如果这是从您的代码中实际复制和粘贴,那就是问题所在。 尽可能避免使用if 语句(它们的计算量很大,尽管在这里它们可能会被优化掉)。实际上,您可以在这里只使用一个 return 语句:return statOne.person.heightM == statTwo.person.heightM && statOne.person.weightKG == statTwo.person.weightKG && statOne.person.gender == statTwo.person.gender;(可能会被分成 3 行以使其更易于人类阅读) 【参考方案1】:

我猜 heightMweightKGgender 是您的 PersonalData 类私有的,这就是您收到错误的原因。仅仅因为您的函数是Statistics 的朋友,并不意味着它们可以访问Statistics成员 的内部。他们只能访问Statistics 的内部。事实上,Statistics 本身甚至无法访问PersonalData 的内部,所以它的朋友们当然没有。

有几种方法可以解决这个问题。您可以将 PersonalData 的成员设为公开 - 但这不是一个好主意,因为您会减少封装。你可以让你的函数也成为PersonalData 的朋友——你最终可能会得到一张奇怪的友谊图(比如 Facebook 的 C++ 课程!)。或者你可以给PersonalData一些公共接口,让其他人可以偷看它的私人数据。

正如@Angew 在 cmets 中指出的那样,当 Statistics 的朋友被命名为 equalFunctionFriend 时,你的函数被命名为 equalFuntionFriend - 你缺少一个字母。这也会导致这个问题。

【讨论】:

以上是关于C++ 友元函数不起作用,在此上下文中为私有错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 友元

C++友元的概念和使用的一些介绍

C++中,啥叫友元函数?啥叫友元类?请举例说明。

c++友元

❥关于C++之成员与友元函数重载运算符

C++友元函数 普通函数声明为友元函数