そしたら Twitter で、こんなのが回ってきました。
これ読んだら少し気が楽になりました。とりあえず、大丈夫そう。テレビとかだとひたすら不安感煽ることばっかりだし、ほんともうテレビとか二度と見ねえよっ。もともとほとんど見てないけど。
class A { private : int a; class B { public : B( A* p ) { p->a = 0; } }; };何が問題かというと、class A の private メンバである変数「a」に対し、class B から public メンバのようにアクセスしているわけです。で、これが普通にコンパイルを通ってしまう。
C++ Standard 11.8 入れ子のクラス |
入れ子になったクラスは他のメンバと同じアクセス権を持ったメンバになります。このクラスを囲っているクラスは、入れ子になっているクラスに対して特別なアクセス権は持たず、通常のルールに従います。 |
class A { private : int a; class B { private : int b; public : B( A* p ) { p->a = 0; // OK } }; void func( B* p ) { p->b = 0; // エラー } };