3

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

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

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 解决。似乎这只是一个错字......我很傻!

4

1 回答 1

2

我猜是heightMweightKG并且gender对您的班级是私有的PersonalData,这就是您收到错误的原因。仅仅因为您的函数是 的朋友并不Statistics意味着它们可以访问. 他们只能访问. 事实上,它自己甚至无法访问 的内部,所以它的朋友当然没有。StatisticsStatisticsStatisticsPersonalData

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

正如@Angew 在评论中指出的那样,当你equalFuntionFriend的朋友被命名时,你的函数就会Statistics被命名equalFunctionFriend——你有一个丢失的字母。这也会导致这个问题。

于 2012-12-02T20:08:44.377 回答