C++のインナークラス

“○×(まるぺけ)つくろーどっとコム”さんのところで、
C++でのインナークラス使った例が出ていました。

数時間前の自分の知識では、この記事まずいだろ…と思っていたので
あやうく掲示板に書き込みをしてしまうところでした。

問題点(懸念点)

C++の場合、インナークラスであっても所属する親のクラスに
自由にアクセスは出来ない。
Javaのようなインナークラスの扱いは出来ず、同様に処理したければ所属する親に対して、
friend class MyInner;
などとフレンド宣言が必要である。

この動作は gccにて確認出来た。
しかしながらマイクロソフト製のコンパイラ(VisualStudio,VisualC++)では
フレンド宣言がなくとも自由にアクセスが可能。
よって、結果はコンパイラに依存していることがわかる。

じゃ、どちらがC++規約として正しいのかと人に聞いたことがある。
そのときには、厳密に正しいのはgccで、VisualStudio側のほうがチェックが甘いという結論に達した。

調査してみた

掲示板に書く前にはやっぱり調査いるよね!ということで調べてみた。

結論は、自分の知識が古かったようです。
gcc(g++ 4.1.2)でもインナークラスは所属クラスに対してアクセスを自由に出来ました。

よって、このバージョンのgcc以降であればうまく動作するようです。
そういえば以前エラーを出していたのは gcc3系だった気がします。

このあたりの調査を進めていくと、どうやらいつの年度のC++基準なのかが関係してくるようです。

  • 1998年基準準拠では、インナークラスは親のクラスに対して自由なアクセス権を持たない
  • 2003年基準準拠では、インナークラスは親のクラスに対して自由なアクセス権を持つ

結論

よって、これからの環境であれば、インナークラスは特に問題にならないようです。
ただ移植性を考えると不味いのでしょうが、それは所属親にfriend 宣言加えることで何とかなるでしょう。

とりあえず、MS依存だ!という結論に達さなかったため、
自分のなかの知識を更新しておかないといけないですね。

最後に、この調査の機会を与えてくれた、IKDさんに感謝です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする