無名クラス

http://www.geocities.jp/ky_webid/cpp/language/030.html

内部クラスを定義するときに、名前を省略すると無名クラスというものになります。

例を見た方が早いですね、実装してみます。

#include <iostream>
using namespace std;

class COuter {
public:
    class {
    public:
        int m_num;
    };
    COuter(int num) : m_num(num) {}
    int Get () const { return m_num; }
};

int main() {
    COuter obj(333);
    
    cout << obj.Get() << endl;
    
    return 0;
}
$ main
333

無名クラスには名前がないのでインスタンス化ができません。またメンバ関数も作れません。またアクセス指定子にはpublicしか指定できません。もしprivateにしてしまうとメンバ変数にアクセスする手段がないからです。

メンバ変数しか登録できなくてpublicしか指定できないのならstructでもまったく同じ処理になります。

class COuter {
public:
    struct {
        int m_num;
    };
    COuter(int num) : m_num(num) {}
    int Get () const { return m_num; }
};

しかし、これ何の役に立つんでしょうか。まったく想像できません。

更に言えばVC2008の環境では無名クラスを使うと警告がでます。

main.cpp(9) : warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。

ということで、こういうものがあるということだけ知っておきましょう。