законно и действительно полезно, чтобы скрыть детали реализации от внешнего мира.
[править] Первоначально я сказал, что это «идиома pimpl»: http://c2.com/cgi/wiki?PimplIdiom но я согласен, что это только часть pimpl о. Этот метод используется pimpl.
Вы «перенаправляете» класс Bar внутрь класса Foo. Совершенно законно, если вы не делаете ничего внутри определения Foo, что потребовало бы sizeof Bar. Вы можете ссылаться на Bar, используя указатель или ссылку (Bar * или Bar &), но если вы объявите член данных в Foo, например:
private: Bar _bar;
Это не сработает. Причина в том, что определения Foo должно быть достаточно, чтобы определить размер Foo. Поскольку размер Bar неизвестен в определении Foo, это сделает размер Foo неопределенным. Но использование указателя будет работать:
private: Bar * _bar;
Потому что размер указателя одинаков и, следовательно, известен независимо от того, как Bar будет позже определен.