C++レビュー前宣言、ネストクラス、ローカルクラス

2459 ワード

まず、前方声明とは何かを見てみましょう.C++では、クラスを定義してからインスタンス化する必要がありますが、実際には、2つのクラスが相互参照したり、クラスのサブオブジェクトメンバーになったりする必要がある場合、先に定義して使用することができず、コンパイルの一環でエラーが発生してコンパイルに失敗した場合、前方宣言を使用する必要があります.また、前方宣言のクラスはインスタンス化できません.次に例を示します.
        
//     A.h   
#ifndef  _A_H
#define _A_H

#include "B.h"
class A
{
public:
    A(void);
    ~A(void);
    B b_; //A    B   
};

#endif

//     B.h   
#ifndef  _B_H
#define _B_H

/*B   A   ,A    B    ,        ,      ,      :
 B.h  A     ,         A.h   , B    A    ,              ,     A        */
//#include "A.h"  

class A;

class B
{
public:
    B(void);
    ~B(void);
    //A a_;  //     ,B      A   
    A *a_;   //     

    void Fun(A &a )  //     
     {

    }
};

#endif

ネストされたクラス
名前の通りネストされたクラスは,クラス体に別のクラスを定義し,クラス中のクラスを形成する場合である.最外層で定義されたクラスを周辺クラス,周辺クラスの内部で再定義されたクラスをネストクラスと呼ぶ.ネストされたクラスの主な役割は、周辺クラスにサービスを提供することであり、周辺クラスはネストされたクラスオブジェクトを周辺クラスの下位実装として使用することができ、同時にユーザーに下位実装を隠すことができる.
ネストされたクラスの注意点:
(1)役割ドメイン上でネストされたクラスは周辺クラスの内部に定義されているため、このクラス名は周辺クラスの内部でのみ使用でき、周辺クラスの外部でこのクラス名を使用する場合は、Out::Inner iなどの名前制限を加える必要がある.
(2)ネストされたクラスのメンバー関数は、その外部で定義できます.
(3)ネストされたクラスのメンバー関数は,周辺クラスのデータメンバーにアクセス権がなく,逆も同様である.ネストされたクラスは文法的な埋め込みにすぎないため、周辺クラスとは実際には平レベルです.
次に、ネストされたクラスの簡単な例を示します.
        
class Outer  //   
{
public:
    class Inner
    {
    public:
        void Fun()  //        
        //{
        //    cout << "Inner::Fun()"<<endl;
        //}
    };

public:
    Inner obj_;
    void Fun()
    {
        cout << "Outer::Fun() "<<endl;
        obj_.fun(); //           ,     。
    }
};

//Inner::Fun() //Error,      。Inner      
void Outer::Inner::Fun()
{
    cout << "Inner::Fun() << endl;
}

int main()
{
    Outer o;
    Outer::Inner i; //     ,               ,          .
    o.Fun();
    i.Fun();

    return 0;
}

局部類
局所クラスとは、関数の内部に定義クラスのことである、このようなクラスを局所クラスlocal classと呼ぶ.ローカルクラスは、定義されたローカルドメイン内でのみ表示されます.さらに、ローカルクラスのメンバー関数はクラスボディに定義され、静的メンバーは使用できません.次に例を示します.
void Fun()
{
    //   ,        
    class LocalClass
    {
    public:
        int a_;
        void Init(int &a ) //        .
        {
            a_ = a;
        }

         //static int b_;  //Error,       static      .
    };

    LocalClass lc;
    lc.Init(10);
}

int main()
{
    Fun();
    LocalClass lc; //Error,            。
}