C++で匿名クラスは作れますか?

[戻る]
ぴょぴょ 2008/07/08(火) 16:24:08
またお世話になります。

タイトル通りですが、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年ほど

アキラ [HomePage] 2008/07/08(火) 17:42:24
この場合だと、 a() の定義はインラインで書くしかないと思います。
__unnamed は VC++ の言語拡張でしょう。

ぴょぴょ 2008/07/08(火) 18:13:22
アキラさんレスありがとう。

確かにインラインなら __unnamed は必要ありませんね。
でもインラインはヘッダファイルに記述しますよね。
もし匿名クラスがとても巨大だった場合(設計上問題ありそうだけど仮に)は
コンパイルに時間が掛かると思います。
これは避けては通れないのでしょうか?

ヘッダとソースに分離できればソースはOBJファイルまたはLIBファイルにして
リンクすれば早そうですが、インラインでは(分離など)は無理ですか?

ITO 2008/07/08(火) 20:26:09
VC++ の言語拡張ではだめですか?
他OSでも使いたいので互換性を保ちたいとか?
VC++より言語仕様進んでいるんで、GCCも別にあるんじゃないかな
とおもいますが?

アキラ [HomePage] 2008/07/09(水) 15:31:55
> もし匿名クラスがとても巨大だった場合
こういう場合はおとなしく名前を付けたほうがいいと思います。
クラス内で行う処理をクラス化したいだけなら、"PImplイディオム"という手もありま
す。(クラス名は必要ですけど)

ちなみに、 __unnamed ですが、 VC++8.0/9.0(2005/2008) では使えませんでした。
(オプション必要なのかな?)

ぴょぴょ 2008/07/09(水) 19:26:20
[[解決]]
ITOさん。
アキラさん。
レスをありがとうございます。

いろいろと考えてダミーのクラス名をつけることにしました。

> ちなみに、 __unnamed ですが、 VC++8.0/9.0(2005/2008) では使えませんでした。
使えないようなら、匿名クラスではなくおとなしく名前を付けてクラスを作ります。
ありがとうございました。

古いスレッドには追加発言できません。