![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Всем привет. А как правильно в заголовочном файле(File.h) обьявить класс или структуру, написаный в файле реализации(File.cpp)?
Спасибо. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
В .h объяви, в .cpp определи. В чем трудность? Если трудность есть, то давай пример свой.
|
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
|
|||
|
||||
Sergio |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
А вот как я его обьявил:
Пишет ошибку: [Linker Error] Unresolved external 'PrivateForm::PrivateForm(System::AnsiString, System::AnsiString)' referenced from E:\PROGRAMMING\Serguk\UNIT1.OBJ Это сообщение отредактировал(а) Sergio - 24.4.2007, 19:28 |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
|
|||
|
||||
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
vinter, всё равно это "уточнение" метода не помогает
![]() |
|||
|
||||
Hurricane |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
Вот так - будет понятно?
В .h файл помещаешь это:
А это - в .cpp файл:
А у тебя получается, что класс PrivateForm объявлен дважды, причем реализация (implementation) есть только для того, что в .cpp файле. Я бы на месте линкера тоже ругнулся ![]() |
||||
|
|||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Это ошибка линкера, а не компилятора. Из чего делаем вывод, что к проекту надо просто подключить .cpp-файл. Добавлено через 1 минуту и 35 секунд Да, ну и конечно, Sergio, это тоже сделай. И все у тебя заработает. Добавлено через 2 минуты и 26 секунд Тьфу блин, не та цитата... короче, сделай так, как посоветовал Hurricane, и будет тебе локальное счастье. |
|||
|
||||
try_to_get |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 426 Регистрация: 19.3.2007 Где: Россия Репутация: нет Всего: 2 |
|
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
try_to_get, в заголовочном файле определение метода? Нехорошо.
|
|||
|
||||
Hurricane |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 10.4.2007 Репутация: 6 Всего: 9 |
![]() ![]() |
||||
|
|||||
Ln78 |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Наверное, имелось в виду
А вообще, использование заглавных букв да и самих имён для имён классов и объектов этих классов здесь вряд ли наилучшее |
||||||
|
|||||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Да там вообще не код, а жесть
![]()
Это сообщение отредактировал(а) Xenon - 25.4.2007, 13:07 |
|||
|
||||
try_to_get |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 426 Регистрация: 19.3.2007 Где: Россия Репутация: нет Всего: 2 |
Ой! Торопился и спутал с Паскалем.
да это правильно. Добавлено через 1 минуту и 56 секунд
Почему? Добавлено через 4 минуты и 9 секунд Чем отличается .h от .cpp? |
||||||
|
|||||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
тем что по принятым канонам в h файле находится интерфейс, а в cpp его реализация
|
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
try_to_get, Страуструп страница 246 "Исходные файлы и программы". Жестко запрещается определение простых функций (кроме встроенных) в заголовочных файлов, а вот определение методов просто нежелательно.
|
|||
|
||||
try_to_get |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 426 Регистрация: 19.3.2007 Где: Россия Репутация: нет Всего: 2 |
Все понял, теперь буду методы писать в .срр Спасибо за ответ! |
|||
|
||||
Sergio |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Всё равно не работает
![]() ![]() ![]() Unit2.cpp
Unit2.h:
Ошибки:
Не пойму почему ![]() |
||||||
|
|||||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Unit2.h:
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Sergio, вы дважды объявляете класс, чего делать не требуется. Класс объявляется в *.H, а реализация - в *.CPP.
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Daevaorn, а я неопределяю 2 разы. Я только вказую конструктор по умолчанию.
mr.Anderson, покажи как правильно? |
|||
|
||||
mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
В *.H - файле пишем:
В *.CPP - файле:
Это сообщение отредактировал(а) mr.Anderson - 26.4.2007, 18:55 |
||||
|
|||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Daevaorn, ... бывает
![]() |
|||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
mr.Anderson, h
cpp
|
||||
|
|||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
vinter, я, конечно, извиняюсь, но что за бред? Чего ради вы в *.CPP снова, можно сказать, переобъявили класс?! Делать именно так надо, как я написал. И это не с моих слов, в конце концов, так и в учебниках написано. Только что проверил.
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Daevaorn, почему? В H - объявление, в CPP - реализация. Я не то же самое в своем коде написал?
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Нет, написал так, как нужно по учебнику. Я вообще класс и реализацию всегда в *.H пишу, не люблю громоздить кучи файлов.
Это сообщение отредактировал(а) mr.Anderson - 26.4.2007, 21:00 |
|||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
издержки copy\past, в сpp конешно же реализация Добавлено через 4 минуты и 15 секунд как раз по учебнику надо с точность да наоборот, стражи включения нужны в h файлах, т.к они подключаются к другим файлам реализациям, и могут быть повторно включены, а вот cpp никуда не подключаются, и следовательно стражи не нужны.
зря, надо разграничивать interface\implementation |
||||
|
|||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А чего ради? Чтобы скрывать от других людей? Я пока еще не понял, как это можно сделать. Все равно нельзя распространять H отдельно от CPP, работать не будет. Поэтому смысл разделения? А вот увеличивать количество файлов класса вдвое не хочется. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
нет просто чтобы человек взявший твой код, не стал бы перелопачивать кучу кода, а посмотрел бы себе отдельно интерфейс, ему не нужна реализация он просто хочет знать какие возможности ему предоставляет этот класс. ну и принято так, интерфейс user-part, а вот в реализацию лезть не положено
![]() вот например множество библиотечных ф-ий, их реализация ведь скрыта от тебя. |
|||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
mr.Anderson, как минимум для того, чтобы у тебя не были файлы на три страницы. Ты можешь распространять, допустим, хедеры для пользователей и для разработчиков абсолютно разные (код не скроется, но ты можешь у хедеров для пользователей выкинуть некоторые функции, которые им не нужны)
Потом, компилятору порой сложно избежать репликации агрегатов из несклольких единиц трансляции. Daevaorn но тот вариант, что vinter кинул (хоть и сдуру) - чисто нарушение ODR. В каком случае это будет работать? Добавлено через 2 минуты и 42 секунды ... немного подумав ... : когда, вероятно, абсолютно индентичны определения, когда определения в разных единицах трансляции? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |