![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
К функции xxx мы обращаться можем из main.cpp. Хотя она и определена в другом файле.
Как создать объект класса First в файле main.cpp? (не использую #include и файлы заголовков)
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Указатель можно создать так
а вот создать обьект - никак без включения заголовочного файла. Откуда ему знать, есть у класса такой конструктор, открыт ли он вообще итд... А это все компилятору нужно знать на этапе компиляции. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
интересно, как для т.с. связано "создание объекта" и "линковка" ? Это сообщение отредактировал(а) mes - 17.7.2009, 14:55 |
|||
|
||||
AlexT84 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 10.7.2009 Репутация: нет Всего: 1 |
Не используя инклуда -- только заново описать класс First.
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
я сейчас разбираюсь в том, как происходит сборка программмы из исходников. линковка - один из её этапов. но до линковки не доходит, т.к. исходник даже не компилирууется. ![]() класс определён в одном translation unit использовать его я хочу в другом translation unit значит необходимо обеспечить взаимодействие между юнитами. здесь сказано следующее:
вы хотите сказать, что нельзя написать программу без использования заголовочных файлов? |
|||
|
||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
почему это нельзя? Можно!
вот она ![]()
Как он будет компилироваться?
поставьте себя на место компилятора. Можно ли компилировать этот код, не зная есть ли класса A конструктор по умолчанию (например). |
||||||||
|
|||||||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
можно пример, чтобы было понятнее о чем идет речь? Добавлено @ 15:57 подозреваю что речь идет об этом
ну так с классами это тоже прокатывает. Тут указана сигнатура функции, компилятор знает все необходимое об этой функции и может оставить остальное линкеру. Если описать структуру класса - для классов будет тоже самое (в принципе это и происходит при включении заголовочного файла). (непонятно зачем приписал extern, он тут не нужен, убрал). Это сообщение отредактировал(а) azesmcar - 17.7.2009, 16:00 |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
функция определена в другом файле. тем не менее линкер/компилятор её находит.
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Ну, прототип функции обявлен ведь.
с классами тоже можно. Вот так. А включение заголовочного файла только копирует его содержимое в текущий. |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
у меня не получается. этап линковки не проходит.
Это сообщение отредактировал(а) zim22 - 17.7.2009, 16:06 |
||||
|
|||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
file1.cpp
file2.cpp
а вот эту часть
заменяют на #include а саму декларацию выделяют в заголовочный файл. |
||||||
|
|||||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Почему в случае определения функции внутри класса линкер не находит её?
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Потому что в этом случае она инлайниться, а инлайн функции как известно должны быть объявлены во всех translation unit-ах. Добавлено через 59 секунд
|
|||
|
||||
zim22 |
|
||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
т.е. можно переопределять её тело, как это ни печально? и во время объявления класса в main.cpp я изменил его члены данных (определил value типа int) - это тоже прокатило... т.е. это уже два разных класса получается, а не один. хотя и не совсем два - т.к. конструктор у них один - общий... ужас какой-то получается
Это сообщение отредактировал(а) zim22 - 17.7.2009, 16:31 |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
точно ![]() а вот насчет этого ужаса
так что то, что это безобразие работает где-то еще ничего не значит ![]() |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
ок. с inline функциями разобрался
![]() как насчёт этого: |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
zim22
Ну на С++ есть множество способов извратиться, потому этот язык и считается сложным и именно потому для него написано столько книг. Просто не надо так извращаться ![]() |
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Вот это тоже работает, в VC 2008 Express, а не должно:
test.cpp
main.cpp
Но при этом выводит 5 в консольке. Не удивлюсь, если g++ откажется это собирать... Не удивлюсь, если соберёт, и выведет 10 ![]() ![]() Это сообщение отредактировал(а) Леопольд - 17.7.2009, 17:07 -------------------- вопросов больше чем ответов |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
а почему бы ему и не работать. как по мне - обычный код ![]() он и должен 5 выводить. по крайней мере я в уме пошагово прошёл - 5 на выходе оказалось ![]()
Это сообщение отредактировал(а) zim22 - 17.7.2009, 17:09 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
По стандарту, это не должно скомпилироваться. -------------------- вопросов больше чем ответов |
|||
|
||||
zim22 |
|
||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
собирает. без единого warning'a ссылочкой не поделитесь где это в стандарте? *** приведенные вами два cpp файла аналогичны нижеизложенному коду, за одним исключением, в котором вы сами нарушили стандарт: переопределили тело инлайн функции.
Это сообщение отредактировал(а) zim22 - 17.7.2009, 17:21 |
||||||
|
|||||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
azesmcar уже цитировал стандарт Попробуйте заменить main вот на это ![]()
А потом на это
надо будет добавить в main #include <iostream> Это сообщение отредактировал(а) Леопольд - 17.7.2009, 17:25 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Однако ворнинга нет... А значит, компилятор забил на этот shall ![]() Добавлено @ 17:30 А вот это даёт разный результат в VC 2008 Express и в gcc 4.3.3 - компиляторам нельзя верить, надо проверять ![]()
Это сообщение отредактировал(а) Леопольд - 17.7.2009, 17:35 -------------------- вопросов больше чем ответов |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
да, глюк неприятный. undefined behavior. однако избежать его достаточно просто - не переопределять inline функции ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
По старинке, пользоваться #include ![]() -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
потому что Вы путаете сущности этапа компиляции и линковки. Для начала исходный код, транслируется в объектный - этап компиляции. На этом этапе Cpp-код лишается всего своего ООП . В итоге объектники cpp, си, паскаля, асма и др. "выглядят" одинаково и из нескольких таких (полученных с разных языков) объектников можно слинковать одну общую прогу. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |