0

私は C++ を学んでおり、フレンド キーボードの使い方についてもっと学ぼうとしています。

ただし、ヘッダー ファイルでネストされたクラスを使用すると問題が発生します。

ヘッダー ファイルは宣言にのみ使用する必要があることはわかっていますが、cpp ファイルを含めたくなかったので、ヘッダー ファイルを使用して宣言とビルドを行いました。

とにかく、クラスのオブジェクトを作成し、その関数にアクセスするために厳密に使用したいmain.cppファイルがあります。

ただし、「friend」キーワードを理解しようとしているため、ヘッダー クラス オブジェクトを使用して main.cpp ソース ファイルでアクセスできる場所に、ヘッダー ファイルで FriendFunctionTest 関数を作成する方法が正確にはわかりません。

ここに私のヘッダーコードがあります:

#ifndef FRIENDKEYWORD_H_
#define FRIENDKEYWORD_H_

using namespace std;

class FriendKeyword
{
    public:
        FriendKeyword()
        {//default constructor setting private variable to 0
            friendVar = 0;
        }
    private:
        int friendVar;

    //keyword "friend" will allow function to access private members
    //of  FriendKeyword class
    //Also using & in front of object to "reference" the object, if
    //using the object itself, a copy of the object will be created
    //instead of a "reference" to the object, i.e. the object itself
    friend void FriendFunctionTest(FriendKeyword &friendObj);
};

void FriendFunctionTest(FriendKeyword &friendObj)
{//accessing the private member in the FriendKeyword class
    friendObj.friendVar = 17;

    cout << friendObj.friendVar << endl;
}

#endif /* FRIENDKEYWORD_H_ */

私の main.cpp ファイルでは、次のようなことをしたかったのです:

FriendKeyword keyObj1;
FriendKeyword keyObj2;
keyObj1.FriendFunctionTest(keyObj2);

ただし、main.cpp はヘッダー ファイルで FriendFunctionTest 関数を見つけることができないため、明らかに機能しません。

この問題を解決するにはどうすればよいですか?

もう一度お詫び申し上げます。オンラインで C++ を学ぼうとしているところです。

4

3 に答える 3

1

このfriendキーワードは、関数または他のクラスがそのクラスのプライベート メンバーにアクセスできるかどうかを指定するためにのみ使用されます。FriendFunctionTestはグローバル関数であるため、クラスの継承やネストは必要ありません。グローバル関数は、呼び出し時にクラス プレフィックスを必要としません。

ソースfriend: http://msdn.microsoft.com/en-us/library/465sdshe(v=vs.80).aspx

于 2012-09-06T03:34:34.390 に答える
0

ここでは、いくつかのまったく異なることについて話しているのです。そのうちの 2 つの例を次に示します。

1) 「友達」:

  • http://www.learncpp.com/cpp-tutorial/813-friend-functions-and-classes/

    // クラス宣言 class Accumulator { private: int m_nValue; public: Accumulator() { m_nValue = 0; } void Add(int nValue) { m_nValue += nValue; }

    // Reset() 関数をこのクラスのフレンドのフレンドにします void Reset(Accumulator &cAccumulator); };

    // Reset() は Accumulator クラスのフレンドになりました void Reset(Accumulator &cAccumulator) { // そして、Accumulator オブジェクトのプライベート データにアクセスできます cAccumulator.m_nValue = 0; }

2) 「ネストされたクラス」:

于 2012-09-06T03:46:44.120 に答える