Форум программистов, компьютерный форум CyberForum.ru

Отделение интерфейса класса от реализации - C++

Восстановить пароль Регистрация
 
molfar
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3
23.01.2010, 10:43     Отделение интерфейса класса от реализации #1
Осваиваю раздел одной книги "Отделение интерфейса класса от реализации". То что получилось можно и нужно скачать по адресу http://************.com/files/sd0dbt0bs (Проект VS9).
GradeBook.h - заголовочный файл с определением класса.
Gradecook.cpp - файл исходников с определением элемент функций класса.
main.cpp - файл исходников, в котором находится ф-я int main().
Интересуют именно строки директив препроцессора
Код
[main.cpp] #include "Gradebook.h"
[GradeBook.cpp] #include "Gradebook.h"
Как ни странно, но при таком раскладе приложение работает.
Собственно прошу многоуважаемое сообщество объяснить, от куда компилятор знает о существовании файла GradeBook.cpp? Я почему-то не вижу здесь логики. Основываясь на своем опыте программирование на php, логичнее было бы написать так, чтобы инклудились бы все три файла.
Код
[main.cpp] #include "Gradebook.h"
[GradeBook.h] #include "Gradebook.cpp"
Очень надеюсь что кто-то поможет мне разобраться в таком вопросе. Может он и не столь важен, но для дальнейшего прогресса мне просто необходимо это понять.
PS Это учебный пример из книги Дейтейла Как программировать на С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
23.01.2010, 11:07     Отделение интерфейса класса от реализации #2
h файлы инклудятся в cpp, но не наоборот.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.01.2010, 12:16     Отделение интерфейса класса от реализации #3
Не знаю, как точно это реализовано в VS, но предполагаю, что как-то так:
Gradecook.cpp подключает Gradecook.h. VS просто компилирует .cpp файлы в объектники. А так как, в нашем спп реализация методов класса линкер потом резолвит символьную таблицу подключая эти методы.
В консоли может примерно так:
Код
[Vourhey@localhost two]$ ll
total 20
-rwxrwxr-x. 1 Vourhey Vourhey 5399 2010-01-23 12:04 main
-rw-rw-r--. 1 Vourhey Vourhey   71 2010-01-23 11:22 main.cpp   использование класса
-rw-rw-r--. 1 Vourhey Vourhey   57 2010-01-23 11:03 one.cpp     реализация методов класса one
-rw-rw-r--. 1 Vourhey Vourhey   55 2010-01-23 11:13 one.h         объявление класса one
[Vourhey@localhost two]$ rm -f main 
[Vourhey@localhost two]$ 
[Vourhey@localhost two]$ 
[Vourhey@localhost two]$ g++ -I./ main.cpp -o main    //будет ошибка, так как символы не найдены
/tmp/ccFPZKT7.o: In function `main':
main.cpp:(.text+0x11): undefined reference to `one::one()'
main.cpp:(.text+0x1d): undefined reference to `one::two()'
collect2: ld returned 1 exit status
[Vourhey@localhost two]$ g++ -c -I./ one.cpp
[Vourhey@localhost two]$ g++ -I./ main.cpp -o main one.o     //отдаем ему объектник скомпиленый из класса
Достаточно знать, что методы есть, а во время линковки они подхватятся. Либо будет ошибка линкера По файлам проекта VS не составляет труда найти cpp-файл с реализацией методов класса. Если проект простой и у классов реализации не связано, то без разницы, где методы реализуются - собери объектники, подсунь линкеру он сам все найдет. В противном случае еще нужно учитывать порядок передачи. Все это в Makefile можно записать.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
23.01.2010, 13:58     Отделение интерфейса класса от реализации #4
molfar:
Если ты не знаешь что такое раздельная компиляция то это плохо.
molfar
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3
23.01.2010, 14:05  [ТС]     Отделение интерфейса класса от реализации #5
Цитата Сообщение от Genius Ignat Посмотреть сообщение
molfar:
Если ты не знаешь что такое раздельная компиляция то это плохо.
Еще не знаю, потому и задаю вопросы и пытаюсь понять.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
23.01.2010, 14:09     Отделение интерфейса класса от реализации #6
Vourhey:
Хороший ответ да, объяснять вроде бы больше и не чего.

molfar:
Добавлено через 1 минуту
А что книг по C++ не нашёл.
Yandex
Объявления
23.01.2010, 14:09     Отделение интерфейса класса от реализации
Ответ Создать тему
Опции темы

Текущее время: 16:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru