Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Организация кода C++. Необходимоть писать имя класса в `.cpp`

Мне кажется немного дикой, неудобной, и осложняющей читабельность кода необходимость указывать имя_класса перед каждой функцией в файле реализации класса.
файл A.hpp
class A { int func(int par); }
файл A.cpp
int A::func(int par){ return par*2/4+1; }
Чтобы упаковать реализацию функций в класс можно писать код в заголовках (получится аля в Java). Там же написано почему это не круто.
class A { int func(int par){ return 2; }; }
Может вам извесны другие варианты записи и организации кода?


Ответ

Это проблема/фича модели компиляции языка C++.
Дело в том, что C++ компилирует только .cpp-файлы, и из них каждый независимо. Это значит, что он при компиляции не знает, к чему относится данный текст, не знает контекста. Когда C++ видит методы файла, компилятор к этому моменту просмотрел сотни (это не преувеличение!) header'ов и видел предварительные описания сотен классов. Он не может просто так прикинуть, к какому из них относится данный метод.
Даже если другой метод организации компиляции можно придумать (например, использовать как-нибудь препроцессор) метод, который вы описали, является привычным и практически единственным общепринятым методом организации исходного кода в C++. Поэтому любая другая организация кода вызовет скорее всего недоумение у ваших коллег.
В других языках, например, C#, нету подобной особенности, потому что все функции определяются внутри класса. Проблем с компиляцией, как в указанном вами вопросе, не возникает, потому что для нахождения других классов не используется #include (который по сути является простой текстовой подстановкой), а двухпроходная и нераздельная компиляция: компилятор при чтении очередного .cs-файла не «забывает» то, что он видел в других файлах.
В других, например, Javascript, проблема даже шире, потому что методы класса объекта могут быть определены где угодно и «появиться» в объекте на любом этапе его жизненного цикла.

Комментариев нет:

Отправить комментарий