またお世話になります。
タイトル通りですが、C++でJavaのような匿名クラスは実装できますか?
やりたいことはクラスの中にクラスを記述したい。
ただしそのメンバクラスはクラス名を持たせたくない。
// ヘッダ
class foo {
public:
foo();
~foo();
class {
public:
int a();
} hoge;
};
// ソース
foo::foo(){}
foo::~foo(){}
int foo::__unnamed::a(){return 123;}
とりあえず上記の方法でコンパイルは出来ました。(ちゃんと動きます)
問題は__unnamedキーワードです。
これはVC++を使っているので処理系の独自拡張ですか?
それともC++の言語仕様で在るんでしょうか?
お聞きしたいことはC++言語仕様で匿名クラスは作れるのか?
[環境]
Windows XP
VC++2003.NET
C++歴1年ほど
この場合だと、 a() の定義はインラインで書くしかないと思います。
__unnamed は VC++ の言語拡張でしょう。
アキラさんレスありがとう。
確かにインラインなら __unnamed は必要ありませんね。
でもインラインはヘッダファイルに記述しますよね。
もし匿名クラスがとても巨大だった場合(設計上問題ありそうだけど仮に)は
コンパイルに時間が掛かると思います。
これは避けては通れないのでしょうか?
ヘッダとソースに分離できればソースはOBJファイルまたはLIBファイルにして
リンクすれば早そうですが、インラインでは(分離など)は無理ですか?
VC++ の言語拡張ではだめですか?
他OSでも使いたいので互換性を保ちたいとか?
VC++より言語仕様進んでいるんで、GCCも別にあるんじゃないかな
とおもいますが?
> もし匿名クラスがとても巨大だった場合
こういう場合はおとなしく名前を付けたほうがいいと思います。
クラス内で行う処理をクラス化したいだけなら、PImplイディオムという手もありま
す。(クラス名は必要ですけど)
ちなみに、 __unnamed ですが、 VC++8.0/9.0(2005/2008) では使えませんでした。
(オプション必要なのかな?)
ITOさん。
アキラさん。
レスをありがとうございます。
いろいろと考えてダミーのクラス名をつけることにしました。
> ちなみに、 __unnamed ですが、 VC++8.0/9.0(2005/2008) では使えませんでした。
使えないようなら、匿名クラスではなくおとなしく名前を付けてクラスを作ります。
ありがとうございました。