Мне кажется немного дикой, неудобной, и осложняющей читабельность кода необходимость указывать имя_класса перед каждой функцией в файле реализации класса.
файл 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, проблема даже шире, потому что методы класса объекта могут быть определены где угодно и «появиться» в объекте на любом этапе его жизненного цикла.
Комментариев нет:
Отправить комментарий