Объявите, но не определите внутреннюю структуру/класс - легальный C++ или нет?

Нет, нет.

8
задан Suma 14 October 2009 в 08:11
поделиться

2 ответа

законно и действительно полезно, чтобы скрыть детали реализации от внешнего мира.

10
ответ дан 5 December 2019 в 08:53
поделиться

[править] Первоначально я сказал, что это «идиома 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 будет позже определен.

9
ответ дан 5 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: