31章 ローカルクラス

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

関数内で宣言したクラスのことをローカルクラスといいます。

内部クラスと同様何時使うのか想像付きませんが、とりあえず実装してみます。

#include <iostream>
using namespace std;

void foo () {
    class CLocal {
    public:
        CLocal (int num) : m_num(num) {}
        int Get () const { return m_num; }
    private:
        int m_num;
    };
    
    CLocal obj(900);
    
    cout << obj.Get() << endl;
}

int main() {
    foo ();
    
    return 0;
}
$ main
900

当然、foo関数のローカルクラスなのでfoo関数以外からはインスタンス化できません。

int main() {
    CLocal obj(800);
    
    return 0;
}
$ cl /W4 /EHsc main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(19) : error C2065: 'CLocal' : 定義されていない識別子です。
main.cpp(19) : error C2146: 構文エラー : ';' が、識別子 'obj' の前に必要です。
main.cpp(19) : error C3861: 'obj': 識別子が見つかりませんでした

他にも色々制約があります。

  • ローカルクラス内で、関数のローカル変数にはアクセスできない(static変数やグローバル変数はOK)
  • ローカルクラスで静的メンバ変数を宣言できない。実体の定義ができないため。


というわけで、ローカルクラスをそもそも使うケースが思い浮かびません。

クラス単体でインスタンス化を不可能にさせるために、関数経由でしかクラスの生成を行わないとか?ありえそうと言えばありえそうですけど、どうなんでしょうか。