1

私のコードの何が問題になっていますか?

以下のコードをGNUG++環境でコンパイルしようとすると、次のエラーが発生します。

friend2.cpp:30:エラー:不完全な型'structtwo'の使用が無効です
friend2.cpp:5:エラー:「structtwo」の前方宣言
friend2.cpp:メンバー関数内'int two :: accessboth(one)':
friend2.cpp:24:エラー:'int one::data1'はプライベートです
friend2.cpp:55:エラー:このコンテキスト内
#include <iostream>
using namespace std;

class two;

class one
{
    private:
        int data1;
    public:
        one()
        {
            data1 = 100;
        }

        friend int two::accessboth(one a);
};

class two
{
    private:
        int data2;

    public:
        two()
        {
            data2 = 200;
        }

        int accessboth(one a);
};

int two::accessboth(one a)
{
    return (a.data1 + (*this).data2);
}

int main()
{
    one a;
    two b;
    cout << b.accessboth(a);
    return 0;
}
4

1 に答える 1

9

メンバー関数は、最初にそのクラスで宣言する必要があります (フレンド宣言ではありません)。これは、フレンド宣言の前に、そのクラスを定義する必要があることを意味する必要があります。単なる前方宣言では不十分です。

class one;

class two
 {
    private:
  int data2;
    public:
  two()
  {
    data2 = 200;
  }
 // this goes fine, because the function is not yet defined. 
 int accessboth(one a);
 };

class one
 {
     private:
  int data1;
    public:
  one()
  {
    data1 = 100;
  }
    friend int two::accessboth(one a);
 };

 // don't forget "inline" if the definition is in a header. 
 inline int two::accessboth(one a) {
  return (a.data1 + (*this).data2);
 }
于 2009-12-27T16:05:54.997 に答える