2016-10-12 6 views
4

ネストされたクラスの友情の概念を理解しようとしていますが、私はコンセプトを適切に理解できません。私はそれを理解するためのサンプルプログラムを書かれているが、プログラムは、私は、エラーの下に取得していますネストされたクラスの友情C++

#include<iostream> 

using namespace std; 


class outerClass 
{ 
    private: 
     int a; 
    public: 
     class innerClass; 
     bool print(innerClass); 
}; 

class innerClass 
{ 
    friend class outerClass; 
    private: 
     int b; 

    public: 
     innerClass() =default; 

}; 

bool outerClass::print(outerClass::innerClass obj) 
{ 
    cout<<"Value of b in inner class is:"<<obj.b; 
} 

int main() 
{ 
    outerClass in; 
    outerClass::innerClass obj; 
    obj.b=5; 
    in.print(obj); 
} 

が動作していない:

try.cpp: In member function ‘bool outerClass::print(outerClass::innerClass)’: 
try.cpp:26:6: error: ‘obj’ has incomplete type 
try.cpp:11:15: error: forward declaration of ‘class outerClass::innerClass’ 
try.cpp: In function ‘int main()’: 
try.cpp:34:28: error: aggregate ‘outerClass::innerClass obj’ has incomplete type and cannot be defined 

私は、インターネット上の記事を読んで、私はポイントがそれらにコメントしてください次学びましたそれらが正しいかどうかは、

  • です。innerClassは、デフォルトでouterClassのすべてのメンバーにアクセスできます。
  • outerClassがinnnerClassのプライベートメンバーにアクセスするためには、outerClassをinnerClassのフレンドクラスにする必要があります。

コードの間違いを指摘し、私が理解している点が正しい場合は助けてください。 outerClass

+0

ここだ[内部クラスの定義に関するヒント](http://stackoverflow.com/questions/8693590/how-to-make内部クラスの定義を外クラス定義の外に置くこと) – grek40

答えて

2

あなたがouterClassinnerClass外を定義したい場合は、ここでそれを行う方法です:

class outerClass 
{ 
    class innerClass; // forward declaration 
}; 

class outerClass::innerClass // definition 
{ 
}; 

残りはobj.b=5のを除いて、OKです。クラスouterClassinnerClass::bにアクセスできますが、関数main()はアクセスできません。

Demo


innerClassは、デフォルトではouterClassのすべてのメンバーにアクセスすることができます。

右。標準[class.access.nest]から:

ネストされたクラスは、メンバーであり、そのようなものとして他のメンバーと同じアクセス権を有しています。outerClassについては


我々はinnerClassへフレンドクラスとしてouterClassようにする必要がありinnnerClassのプライベートメンバーにアクセスします。

右。標準[class.access.nest]から:

囲むクラスのメンバーは、入れ子になったクラスのメンバーへの特別なアクセス権を持っていません。

+0

私は間違いを訂正しましたが、依然としてprint関数内のprivateClassのprivateメンバーにアクセスできません。あなたは助けてもらえますか? –

+0

@MayankJainデモをご覧ください。 – sergej

+0

あなたはそれを意味しますか? "あなたはメインではできない" ..(あなたが書いた) –

4

ラインclass innerClass;には、ユーザーが定義したことがないclassから前方宣言です。

したがって、outerClass::innerClassは、の不完全タイプです。

class innerClass 
{ 

で始まる別のinnerClass定義は、前方宣言されたクラスとは全く異なるclassです。

friend class outerClass;の文が定義されたinnerClass内に問題はありません。

+0

申し訳ありませんが、それは些細な間違いでした。私はそれを修正しますが、今でも私は印刷機能でprivateClassのprivateメンバーbにアクセスすることができません。 –

0

私はあなたがあなたがここfriend class

を使用していないnested classを使用することができますnested class
を使用していないfriend classを使用することができますnested classfriend class
で混乱していると思うが、いくつかの例です:

class A {}; 
class B {}; 

ここでAクラスはBクラスを認識しますが、BクラスはAクラスを認識できません。したがって、AクラスにBクラスが存在することを伝える必要があります。
これやって事は、そう前方宣言
と呼ばれている:

class B;  // forward declaration 
class A {}; // A knows the B 
class B {}; // B knows the A 
関連する問題