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】:
我猜 heightM
、weightKG
和 gender
是您的 PersonalData
类私有的,这就是您收到错误的原因。仅仅因为您的函数是Statistics
的朋友,并不意味着它们可以访问Statistics
的成员 的内部。他们只能访问Statistics
的内部。事实上,Statistics
本身甚至无法访问PersonalData
的内部,所以它的朋友们当然没有。
有几种方法可以解决这个问题。您可以将 PersonalData
的成员设为公开 - 但这不是一个好主意,因为您会减少封装。你可以让你的函数也成为PersonalData
的朋友——你最终可能会得到一张奇怪的友谊图(比如 Facebook 的 C++ 课程!)。或者你可以给PersonalData
一些公共接口,让其他人可以偷看它的私人数据。
正如@Angew 在 cmets 中指出的那样,当 Statistics
的朋友被命名为 equalFunctionFriend
时,你的函数被命名为 equalFuntionFriend
- 你缺少一个字母。这也会导致这个问题。
【讨论】:
以上是关于C++ 友元函数不起作用,在此上下文中为私有错误的主要内容,如果未能解决你的问题,请参考以下文章