Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов в коде класса 
V
    Опции темы
hoz
Дата 20.4.2014, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Читаю Дейтела. Вот уже какой раз встречаю, что в примерах кода встречаются странные моменты. Сразу думал, что типа описался переводчик или ещё что-то типа того. Но по-скольку данный момент встречается постоянно, то я всё-таки решил задать вопрос. Т.к. у меня самое последнее издание, которого на просторах интернета я не встречал, то приведу подобный пример с другого издания данного автора.
Имеется интерфейс класса String, который находится в включаемом файле string2.h
Имеется реализация класса, String, в котором объявлены и описаны всё функции-элементы и элементы-данные класса String. Файл реализации находится в string2.cpp
Проверка класса происходит в коде Fig8_5.cpp. В данном коде разумеется присуствует функция main() и всё в плане компановки кода понятно и логично. Но странно одно. Почему в данный код, где проверяется класс включается только файл интерфейс класса ? Ведь он не знает о реализации данного класса?
Горы кода не привожу, т.к. там пришлось бы делать скриншоты длиннющие. Но надеюсь и так всё понятно. Суть я объяснил.
Я б сделал иначе. По логике файл-интерфейс класса можно включать в компилируемый файл реализации класса. А класс уже импортировать в сам код ( с функцией main() ). Неужели это не логичнее?
PM MAIL   Вверх
Alexeis
Дата 21.4.2014, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(hoz @  21.4.2014,  00:43 Найти цитируемый пост)
Почему в данный код, где проверяется класс включается только файл интерфейс класса ? Ведь он не знает о реализации данного класса?

  Для компиляции не нужно знать где реализация. Достаточно знать сигнатуру функций класса и его описание. Компилятор компилирует каждый модуль независимо, а там где не у него нет реализации он не компилирует, а вставляет символьную ссылку, которую наполнит смыслом линкер. Так что, чтобы все работало достаточно, чтобы линкер знал из каких файлов состоит проект, а компилятору совсем не обязательно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BlackSpace
Дата 21.4.2014, 03:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.4.2014

Репутация: 1
Всего: 1



hoz, наверное Вы работаете в какой-нибудь IDE?
Если так, то рекомендую сначала научиться работать с компилятором из командной строки. 
Также важно прочитать о процессе создания исполняемого файла. Этапов в этом процессе много.

Итак, есть три файла. Все в одном каталоге.

program.cpp
Код

#include "myclass.h"

using namespace std;

int main(){
    myClass mc;
    
    return 0;
}



myclass.h
Код

#ifndef MYCLASS_H_
#define MYCLASS_H_

#include <iostream>

class myClass{
public:
    myClass();
};

#endif /* MYCLASS_H_ */


myclass.cpp
Код

#include "myclass.h"

myClass::myClass(){
    std::cout << "New object created" << std::endl;
}



У меня компилятор g++, а линковщик ld ( вызывается компилятором автоматически ) . Пробую создать исполняемый файл с помощью следующей команды.
Код

g++ -o program program.cpp


На что получаю интересный ответ.

Код

/tmp/ccVUCVJb.o: In function `main':
program.cpp:(.text+0x11): undefined reference to `myClass::myClass()'
collect2: error: ld returned 1 exit status



Так вот видно - линковщик ld написал мне об ошибке. Он понятия не имеет где реализация конструктора myClass::myClass() 
Так откуда же линковщик узнает где реализация конструктора myClass()?

А от меня же и узнает. Я ему сам об этом напишу.
Код

g++ -o program program.cpp myclass.cpp


Вот теперь все в порядке и у меня появился исполняемый файл. Запущу его для проверки.
Код

./program
New object created


Все работает. Таким образом, сообщать о всех файлах с реализацией - задача программиста. IDE хоть и решает эту задачу самостоятельно, но работать с компилятором из командной строки необходимо уметь.
В случае с IDE - обычно она сама формирует опции для компилятора и добавляет пути к файлам, которые пользовательдобавляет в проект.


Это сообщение отредактировал(а) BlackSpace - 21.4.2014, 03:39
PM MAIL   Вверх
NoviceF
Дата 21.4.2014, 09:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



hoz, почитай что такое "единица трансляции", внутреннее и внешнее связывание. Это должно прояснить каритну.
PM MAIL   Вверх
hoz
Дата 21.4.2014, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(BlackSpace @  21.4.2014,  03:20 Найти цитируемый пост)
hoz, наверное Вы работаете в какой-нибудь IDE?

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


Цитата(NoviceF @  21.4.2014,  09:54 Найти цитируемый пост)
hoz, почитай что такое "единица трансляции", внутреннее и внешнее связывание. Это должно прояснить каритну.

Сегодня же и почитаю.
PM MAIL   Вверх
BlackSpace
Дата 21.4.2014, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.4.2014

Репутация: 1
Всего: 1



hoz, я сам люблю некоторые IDE. Удобно в них мне. Много вкусностей. Рефакторинг, подсветка, автодополнение, автоформатирование и другие.
Но запросто пользуюсь простым текстовым редактором ( любимый vim  ) и общаюсь с компилятором через командную строку. 

Так как более опытные люди в прошлом мне изначально советовали оставить все IDE и учиться работать с командной строкой. Этот опыт дает понимание что хочет от тебя компилятор и что тебе дает на выходе. Когда сложностей уже не возникает и проект чуть больше чем маленький, то вполне можно удобно рабоать в IDE. Я около года вообще не открывал IDE и все проекты писал в vim и общался с компилятором только через командную строку. Чего и Вам советую сделать.

Цитата(hoz @  21.4.2014,  14:35 Найти цитируемый пост)
Я так понял, если классов несколько, то при компиляции придётся дописывать каждый класс для линковки... Странный подход.

Не совсем так. N классов могут быть определены в одном заголовочном файле .h и реализация их методов может быть в другом одном файле .cpp
Тогда в опциях компилятору ( кроме файла с функцией main() ) надо будет передать лишь один файл .cpp

PM MAIL   Вверх
hoz
Дата 21.4.2014, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



BlackSpace, я с редактором Vim сталкивался ещё когда изучал FreeBSD. Но цели были другие. Редактор, несомненно, очень крутой. Тока вот ситуация такая, что у меня уклон чутка иной. Я занимаюсь реализацией некоторых стратегий торговых экпертов для торговли на различных торговых инструментах.
 Изначально писалось всё на mt4. Потом я понял, что на нём далеко не уедешь.. Ещё тогда ничего не знал ни о классах, ни о инкапсуляции.. Вообще даже не слышал много, что сейчас вот изучаю активно. Но пришёл момент, когда я застрял на месте, и немало времени прошло пока смог понять, что мне нужно. Причина была в том, что не было желания объявлять те же элементы и, вообще узлы кода, как таковые по несколько раз. 
Понимаю, что то что стало из mt4 это С++ - подобное нечто, но не совсем то. Да, со временем можно и даже нужно будет всё-таки реализацию основных функций-элементов перекинуть в dll вообще, да и вообще чисто на C++. Но, на данный момент, скрестить mt4 и С++ я не совсем представляю как. Потому приходится как-то крутится в том IDE, который предоставляет их платформа.
 Vim на винде не используется, на сколько я слышал. Да и то, что я пишу, на Vim'е не написать. Потому, научиться этому, конечно, можно. Но писать без IDE, как Вы, навряд ли выйдет.

Это сообщение отредактировал(а) hoz - 21.4.2014, 18:37
PM MAIL   Вверх
kemiisto
Дата 21.4.2014, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(hoz @  21.4.2014,  13:35 Найти цитируемый пост)
Интересно зачем было городить такое..

Тот самый момент, когда человек, чьи мозги не изгажены "айтишной" пропагандой уловил суть. smile 

Нагородили, потому что не проектировали. С++ родился в ходе тяп-ляпничества одного господина, чьё имя мы  здесь не будем произносить. smile Жалкие потуги исправить жуткие огрехи в дизайне языка мы наблюдаем уже какой десяток лет. Но фундаментальнейший изъян в виде отсутствия модулей, видимо, устранен так и не будет.

В очередной раз всё это разжёвывать уныло. Решение Ваших проблем лежит, по всей видимости, в другой плоскости. Вы выбрали неправильный инструмент для решения задачи. Вам С++ не подходит, потому что Вы не программист-профессионал (то есть не программист по профессии). Более того, он Вам и не нужен, так как не будучи программист-профессионалом, Вы преимуществ из его использования не извлечёте, а нагорожено там ой-ой-ой.
 
Цитата(hoz @  21.4.2014,  17:34 Найти цитируемый пост)
Изначально писалось всё на mt4.

Вы бы хоть подробнее объяснили, что за задачу Вы пытаетесь решить? И что такое mt4? Потому что язык (и платформу) выбирают под задачу.

Это сообщение отредактировал(а) kemiisto - 21.4.2014, 19:11


--------------------
PM MAIL WWW GTalk Jabber   Вверх
vinter
Дата 21.4.2014, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(kemiisto @  21.4.2014,  20:09 Найти цитируемый пост)
Нагородили, потому что не проектировали. С++ родился в ходе тяп-ляпничества одного господина, чьё имя мы  здесь не будем произносить

kemiisto, учитывая, что C++ старше тебя, тебе не кажется, что ты несколько не понимаешь тех реалий? 
Цитата(kemiisto @  21.4.2014,  20:09 Найти цитируемый пост)
Но фундаментальнейший изъян в виде отсутствия модулей, видимо, устранен так и не будет.

будет. Более того уже есть экспериментальная реализация, то ли в gcc, то ли в clang.

Это сообщение отредактировал(а) vinter - 21.4.2014, 19:15


--------------------
Мой блог
PM MAIL WWW   Вверх
kemiisto
Дата 21.4.2014, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(vinter @  21.4.2014,  18:15 Найти цитируемый пост)
kemiisto, учитывая, что C++ старше тебя, тебе не кажется, что ты несколько не понимаешь тех реалий?

О, нет. Я то как-раз понимаю. Как понимаю и то, что сейчас реалии совсем иные.

Цитата(vinter @  21.4.2014,  18:15 Найти цитируемый пост)
Более того уже есть экспериментальная реализация, то ли в gcc, то ли в clang.

Как можно реализовать то, чего нет в стандарте? Вы не понимаете, видимо, про какую модульность я говорю.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
BlackSpace
Дата 21.4.2014, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.4.2014

Репутация: 1
Всего: 1



hoz, а я Вас не склоняю именно к vim. Это дело вкуса, предпочтений, а vim я привел просто как пример редактора. Если решили изучать C++  потому что оно Вам надо, то сосредоточтесь на нем и забудьте пока про другое. Изучайте C++ по Вашим любимым учебникам, но не используя никаких IDE. Только простой редактор кода ( NotePad++, блокнот и т.д. ) и командная строка. Плюс изучение справочных материалов о Вашем компиляторе. 
А когда разберетесь на некотором уровне в C++, проработав несколько учебников - будет проще ответить на вопрос - для каких задач Вам лучше использовать C++.

Это сообщение отредактировал(а) BlackSpace - 21.4.2014, 19:47
PM MAIL   Вверх
hoz
Дата 21.4.2014, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(kemiisto @  21.4.2014,  19:09 Найти цитируемый пост)
Тот самый момент, когда человек, чьи мозги не изгажены "айтишной" пропагандой уловил суть.  

kemiisto, таким образом, Вы согласны со мной, что я предложил в плане использования классов? Имею ввиду, в файл реализации включать файл-интерфейс, а в программу уже импортировать скомпилированный файл-реализации... Вы так делаете? smile 

Цитата(kemiisto @  21.4.2014,  19:09 Найти цитируемый пост)
В очередной раз всё это разжёвывать уныло. Решение Ваших проблем лежит, по всей видимости, в другой плоскости.

И в какой же?


Цитата(kemiisto @  21.4.2014,  19:09 Найти цитируемый пост)
Вы выбрали неправильный инструмент для решения задачи. Вам С++ не подходит, потому что Вы не программист-профессионал (то есть не программист по профессии). Более того, он Вам и не нужен, так как не будучи программист-профессионалом, Вы преимуществ из его использования не извлечёте, а нагорожено там ой-ой-ой.

На данный момент, мне нужны некоторые пусть даже основы. Т.к. все выкрунтасы мне точно не к чему. Нужно понимать, хотя бы базу.

Цитата(kemiisto @  21.4.2014,  19:09 Найти цитируемый пост)
И что такое mt4?

Вот это и есть mql4 под терминал МТ4. Там же и редактор кода имеется встроенный в платформу. Языки то бывают разные, и платформы тоже.. но я, на данный момент, пишу под эту по причине распространённости оной.

Цитата(kemiisto @  21.4.2014,  19:09 Найти цитируемый пост)
Вы бы хоть подробнее объяснили, что за задачу Вы пытаетесь решить? Потому что язык (и платформу) выбирают под задачу.

kemiisto, я выше писал, что "застрял" в один "прекрасный" момент над очередным творением и понял, что дальше так продолжаться не может. А причина в том, что я писал чисто блоками. Были только методы + глобальные переменные. Потом добавил инклюдники + библиотеки. Этого оказалось мало, т.к. когда библиотеки используют множество повторяющихся кодов и переменных, это есс-но не вариант. Вот пришлось думать...
 Т.к. mql4 - Си подобный язык. (изначально). А последняя версия больше С++ - подобный. Так вот я решил проштудировать С++, что научиться решать подобные задачи. Как Вы заметили, я не профессионал, а любитель, и, потому мне сложновато многие вещи понимать с ходу. Но по тиху въезжаю.
 После кропотливого выбора, я приобрёл пару книг: Дейтела "Как программировать на С (Седьмое издание)" и Стивена Прата "Язык программирования С++ (6-ое издание)". Начал с Дейтела.
 Решил освоить вещи, которые нужны. Классы, полиморфиз, виртуальные классы, инкапсуляцию.. Вот потиху читаю.
 Если я пишу на С++ - подобном языке, то у меня вариантов то нет. Получается мне нужен С++. Как же иначе?

Это сообщение отредактировал(а) hoz - 21.4.2014, 19:55
PM MAIL   Вверх
vinter
Дата 21.4.2014, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(kemiisto @  21.4.2014,  20:22 Найти цитируемый пост)
Как можно реализовать то, чего нет в стандарте? 

а стандарт по твоему ангелами с неба спускают? Всё обновление стандартной библиотеки последних редакций есть влияние буста. Другие фичи имеют больший потенциал быть принятыми в стнадарт, если уже есть реализация, на которой можно обкатать некоторые вещи. А не просто теорию мусолить. Так, например, concepts lite уже реализованы на какой-то ветке gcc. 

Что добавляет оптимизма, так это большое внимание уделяемое модулям. Это одна из очень важных фич, которую многие ждут. Глядишь и увидим её в 17-м.

Это сообщение отредактировал(а) vinter - 21.4.2014, 19:55


--------------------
Мой блог
PM MAIL WWW   Вверх
kemiisto
Дата 21.4.2014, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(vinter @  21.4.2014,  18:54 Найти цитируемый пост)
Глядишь и увидим её в 17-м.

ТС такие перспективы врядли устроят. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
tzirechnoy
Дата 21.4.2014, 20:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Цитата
 Проще вроде как было б, включить класс в файл реализации... а получившееся уже добавлять в программу.. Не так ли?


Тогда пришлось бы каждый раз при компиляцыи твоего файлика компилировать и всю реализацыю. Если подключаешь какую-нибудь Qt, исходник которой занимает десяток миллионов строк кода и компилируется день на приличной машыне -- это было бы крайне неудобно.

Потому реализацыя компилируется чаще всего отдельно. В объектный файл, с расшырением .o (на винде -- .obj). А затем отдельные объектные файлы склеиваются вместе в библиотеки объектных файлов -- изначально -- файлы с расшырением .a (archive), последние два десятка лет, когда эти библиотеки объектных файлов стали разделяемыми  -- в .so (shared object, разделяемый объектный файл) (в винде -- .dll, dynamic link library, библиотека с динамическим связыванием, по сути -- тожэ самое).

Отличие .so от обычных объектных файлов и их архивов -- что обычные объектные файлы при компиляцыи включаются в получающийся образ программы. А разделяемые -- нет, в образе программы на них имеются только ссылки. Эти ссылки связываются (обновляются) при запуске программы, что, с одной стороны, требует чтобы кроме файла с программой где-то в доступном месте лежали ещё и .so-библиотеки. С другой -- библиотеки лежат на диске один раз в одном месте, а не забивают каждый выполняемый файл, что позволяет их и быстрее грузить (меньшэ обращаться к диску, если библиотека ужэ в памяти), и проще обновлять (только сменить один файл, вместо того, чтобы перекомпилировать всё, что от неё зависит).

В общем, идея использовать только некоторый интэрфейс при компиляцыи, и не требовать реализацыи -- очень полезная, по факту.


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0990 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.