Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Разбить программу на подфайлы |
Автор: lesha_od 20.12.2006, 13:12 | ||||
Написал программу, и мне надо ее разбить на подфайлы. Пока что вся программа в одном файле. Вот главная программа, к которой надо подключить функции отдельными файлами:
и вот одна из функций, ее надо поместить в файл clearall.cpp
Пробовал инклюдить по-разному, но выдается unresolved symbol и т.д. Как сделать? |
Автор: jnb 20.12.2006, 13:15 | ||
ты наверное забыл *.срр в проект подключить |
Автор: KelTron 20.12.2006, 14:04 |
Покажи полный код файла срр, со всеми инклудами... |
Автор: Anikmar 20.12.2006, 16:04 |
Первый код это cpp файл? Если да - то не будет работать, когда компилится второй код компилятор не знает объявления класса List. Объявление класса надо вынести в отдельный .h файл и инклудить его. Можно конечно инклудить и cpp файлы, только вот вопрос зачем? |
Автор: Любитель 20.12.2006, 16:40 |
Anikmar, только тогда их компилить не надо (инклюдимые файлы). Иначе линкер ругнётся мол "symbol .. defined in ...". |
Автор: Anikmar 20.12.2006, 17:06 | ||
Вот я и спрашиваю Зачем? Я сказал, что теоретически можно инклудить cpp файлы - это чистая правда. Общепринятый подход: Класс объявляется и загоняется в .h файл Все реализации запихиваются в cpp файл (можно, конечно и в несколько - только зачем, опять таки не понимаю) Когда реализация используется вместе с объявлением - лично я никогда это не использую (ну не нравится мне это) И уж тем более я никогда не объявляю класс в cpp модуле - это на мой взгляд ерунда получается. |
Автор: zabivator 20.12.2006, 17:11 |
Anikmar, некоторые классы-посредники удобней объявлять в cpp файле. Наружу тогда не торчит этот "сервисный" класс. |
Автор: Anikmar 20.12.2006, 17:15 | ||
Может быть - просто у меня таких классов нет... Внутри я максимум использую нумераторы, тем не менее соглашусь, что посредника, который имеет пару-тройку коротеньких методов можно влепить, но в данном конкретном случае, когда используются достаточно большие методы не вижу причин отказаться от размещения класса в отдельном файле - потом легче править, легче искать. Но это чисто мое мнение, конечно, на вкус и цвет... |
Автор: zabivator 20.12.2006, 17:31 | ||
Вот пример из cppшника. |
Автор: Anikmar 21.12.2006, 09:33 | ||
Честно говоря, приведенный пример не особо впечатлил. Больше похоже на заплатку. Не могу сказать, что сходу можно посмотреть что делает nsg::console::ResponseHandler, а класс Handler - больше похож на временный наворот, предназначенный для дальнейших усовершенствований. Как только они начнут реализовываться - то либо будет создан для Handler отдельный файл либо данный код перестанет быть удобоваримый. |
Автор: zabivator 21.12.2006, 11:28 | ||
Это не заплатка. Это способ, используя единственную реализацию ( SynchronousImplementation ) обеспечить необходимое для использования количество сигнатур. |
Автор: Anikmar 21.12.2006, 15:38 |
На самом деле спор ни о чем. В моем понимании описание и реализация некого отдельного класса внутри модуля конечно имеет право на жизнь. Но лично я придерживаюсь стиля, когда описание класса находится в отдельном заголовке. При дальнейших усовершенствованиях проекта не будет никаких проблем - подключай заголовки сколько влезет. А вот если маленький служебный класс ну очень понадобится в другом модуле (ну получился он удобный и красивый) - то тогда это повлечет изменение сишника, естественно перекомпиляцию и т.п. Это мой стиль, я просто его придерживаюсь. |
Автор: Любитель 22.12.2006, 16:52 |
Anikmar, согласен с тобой. Действительно внутренние классы предпочитаю объявлять в как вложенные в прайват. |
Автор: zabivator 22.12.2006, 19:37 |
Anikmar, если классс понадобился где-то еще - явное указание на то, что его надо вынести в отдельный h-файл. А если класс сужебный, и используется только в одном месте - тогда лучше в cpp, потому что его доработка не должна вызывать каскадной перекомпиляции, что будет в случае, если его объявить как private. Если же просто сделать предекларацию, то мне так не очень нравится... Ну снесу я его потом вообще, и снова будет перекомпиляция. Поскольку этот класс - детали реализации, я предпочитаю держать в его в файле с реализацией. |
Автор: Любитель 23.12.2006, 15:56 |
Млин, развели спор по пустяковому вопросу. В принципе это дело каждого (абсолютно). Но всё-таки чем лучше класс в прайват, тем, что мы можем спокойно объявить прайват-члены этого класса (если сие нужно). В Qt, скажем сделано соглашение, что в хейдерах идёт предобъявление класса, с суффиксом Private. В классе объявляется поле - указатель на этот класс. Других полей умногих кутешных классов почти нет. Однако, сам внутренний класс часто объявляется в отдельном хейдере, хотя инклюдится всего единожды. Ну, максимум, дважды: d обычном файле и в файле с суффиксом _p. Таким образом удаётся избежать перекомпиляции файлов, использующих наш класс, когда мы добавляем/удаляем у него поля (согласитесь, размер указателя от этого не меняется). Время компиляции без сомнения уменьшается, но... мне не нравиться такой стил. Постоянное обращение через всякие d_ptr всё же запутывает код (не то, чтобы нечитабельно, но мне не нравиться). |
Автор: zabivator 23.12.2006, 17:59 |
Anikmar, конечно, дело вкуса. Я мог бы его вообще локальным объявить, поскольку он только одному методу нужен. Или локальные классы тоже зло? Тогда курим stl. |
Автор: Любитель 23.12.2006, 18:08 |
Не в коем случае! Но |