0

私の質問はとても簡単です。フレンド機能について学んでいるのですが、これがなぜかうまくいきません。画面クラスを Window_Mgr クラスと交換してから、画面クラスの前方宣言を追加した場合にのみ言葉になります。その時点で「Relocate」の存在を画面が認識していないので動作しないのでしょうか?

class Window_Mgr;
class screen
{
public:
    typedef string::size_type index;
    friend Window_Mgr& Window_Mgr::relocate(int, int, screen&);
private:
    int width, height;
};

class Window_Mgr
{
public:
    Window_Mgr& relocate(int r, int c, screen& s);
private:

};

Window_Mgr& Window_Mgr::relocate(int r, int c, screen& s)
{
    s.height=10;
    s.width=10;
};

int main(int argc, char* argv[])
{

    system("pause");
}
4

2 に答える 2

2

Window_MgrBEFOREクラスを定義する必要があります。これは、コード内でコンパイラがname のメンバー関数を実際に持っているscreenことを確認できないか、単に嘘をついているためです。コンパイラはファイルを上から下に解析し、その途中で、すべての宣言が嘘ではなく事実であることを確認します。Window_Mgrrelocate

relocate()は type のパラメーターを取るため、代わりにscreen&の前方宣言を提供する必要がありますscreen!

これらの修正 (およびその他の小さな修正) により、このコードは正常にコンパイルされるようになりました (愚かな警告は無視してください)。

于 2013-01-18T15:56:00.627 に答える
1

はい、Window_Mgr::relocateフレンド宣言時点では不明です。Window_Mgr事前に定義する必要があります。

于 2013-01-18T15:54:29.610 に答える