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

これを回避する方法はいくつかあります。メンバーをPersonalData公開することもできますが、カプセル化を減らすので、それは良い考えではありません。あなたはあなたの関数を友達にすることもできますPersonalData-あなたは友情の奇妙なグラフになってしまうかもしれません(C ++クラスのFacebookのように!)。またはPersonalData、他の人がそのプライベートデータを覗き見できるようにするパブリックインターフェイスを提供することもできます。

@Angewがコメントで指摘しているように、あなたの関数はequalFuntionFriend、の友人が名前を付けられたときに名前Statisticsが付けられequalFunctionFriendます-あなたには文字がありません。それもこの問題を引き起こします。

于 2012-12-02T20:08:44.377 に答える