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)
- ローカルクラスで静的メンバ変数を宣言できない。実体の定義ができないため。
というわけで、ローカルクラスをそもそも使うケースが思い浮かびません。
クラス単体でインスタンス化を不可能にさせるために、関数経由でしかクラスの生成を行わないとか?ありえそうと言えばありえそうですけど、どうなんでしょうか。