Для C ++ это проблема реализации.
Компилятор C ++ должен иметь возможность генерировать код, который использует класс, только просматривая объявление класса, а не реализацию. Одна очень важная вещь, которая требуется компилятору, - это размер экземпляра класса, потому что C ++, среди прочего, обрабатывает подобъекты в объектах путем встраивания, а не хранения ссылки на отдельный объект. Чтобы иметь возможность построить объект (например, struct X { Y y; Z z; }
), размер всех подобъектов (например, Y
и Z
) должен быть известен заранее.
Обходной путь для этой проблемы - использовать шаблон "pimpl" (также называемый шаблоном "межсетевого экрана компилятора") , который позволяет скрыть все внутренние детали от пользователей класса. К сожалению, это сопряжено с некоторыми дополнительными затратами времени выполнения, но в большинстве случаев это незначительная цена. При таком подходе общедоступный объект всегда будет иметь размер указателя, и все данные в экземпляре будут доступны с использованием дополнительного косвенного обращения ... преимущество заключается в том, что вы можете добавлять закрытые члены-данные, и пользователям класса не нужно быть перекомпилированным (и если ваш класс находится, например, в DLL, это позволяет поддерживать даже двоичную совместимость).
Возможность объявить только частные методы (без данных) в части реализации была бы возможна без какой-либо дополнительной сложности для компилятора, но разработчик C ++ решил, что вместо этого лучше оставить одно объявление для класса.
На самом деле даже простое добавление частного метода может повлиять на размер экземпляра класса во многих реализациях (например, если частный метод является единственным виртуальным в классе).