Метод объявлен в классе, но не определен - PullRequest
10 голосов
/ 09 февраля 2012

У меня есть класс, который объявляет метод, но не реализует его.Метод не является виртуальной функцией.В соответствующем файле cpp я не нашел определения того же метода.Все остальные методы, объявленные в классе, были определены.

Я скомпилировал код и все прошло нормально.У меня сложилось впечатление, что cpp должен предписать определение объявленного метода.

Благодарим вас за то, что кто-то мог бы уточнить это.Я использую компилятор cl из VS2010.

Ответы [ 4 ]

10 голосов
/ 09 февраля 2012

Ваш код скомпилируется, но он выдаст ошибки связывания.

Создание исполняемого файла вашего проекта включает в себя два этапа:

  • Компиляция
  • Связывание

Во время Компиляция компилятор просто переводит исходный код в объектный код, проверяя семантику языка.
Во время Связывание компоновщик фактически ищет определения символов и создает исполняемый файл из нескольких объектных файлов (созданных во время компиляции).

Компилятор компилирует исходный код в каждой единице перевода (файлы заголовков .cpp +) отдельно и, следовательно, предполагает, что определение должно присутствовать в каком-либо другом исходном файле.Это компоновщик, который пытается найти ссылки на определения функций, и, следовательно, пропущенное определение будет сообщено компоновщиком.

Обратите внимание, что компоновщик должен связывать только те символы, которые используются вашей программой,
Например: если ваша программа объявляет функцию, не дает определения и затем никогда использует / вызывает функцию где угодно, компоновщику не нужно встраивать код для перехода по адресу, где объектный код функции находится на любом сайте вызова функции.
При таком сценарии компоновщик простоникогда не нужно искать определение функции вообще.Следовательно код будет компилироваться и ссылаться.

3 голосов
/ 09 февраля 2012

Это обычная техника предотвращения присвоения или копирования. Если вы объявляете это, но не определяете это, возникает ошибка связывания, если вы пытаетесь использовать это, то есть предотвращает непреднамеренное использование людьми

3 голосов
/ 09 февраля 2012

Нет требования для метода, который будет реализован в определенном файле. Действительно, считается (или считалось) хорошей практикой программирования иметь один файл на метод для уменьшения раздувания при связывании с библиотеками.

Это означает, что при наличии заголовочного файла, который определяет класс (и, по-видимому, не имеет реализации в нем), компилятор может только предполагать, что все функции где-то реализованы. Только в тот момент, когда система пытается собрать все воедино (стадия соединения), становится очевидным, что вы имеете в виду что-то, чего нет.

0 голосов
/ 21 апреля 2016

Компилятор не жалуется, потому что нет синтаксической ошибки / ошибки компилятора. Компоновщик не жалуется, потому что вы не вызываете функцию в своей программе, поэтому ее не нужно связывать.

...