Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2008, 17:03   #41
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
купи хорошую книгу. одну.
и учи по ней, а не лазь по инету и не читай с разных источников.
закончишь с одной книгой, бери другую и так далее.

там написано все коректно, и я сказал тоже самое что написано там.

а)компилятор не может сделать структуру, потому что структура не может содержать методы, а твой класс Cat содержит метод feed().

б)структура не может содержать методы, а твоя структура Cat содержит метод feed().

(я также начинал со многих книг, но знакомый человек, посоветовал мне учить только по одной книге, забивая на все остальные(за исключением справочников)).
Ну в принципе это не структура, это псевдокод, сделан лишь для понимания процесса, и в нем спокойно могут быть и методы и переменные, ибо это просто переформированный класс.
Вот ты говоришь что я нелогично рассуждаю, ок, может быть ты покажешь как надо понимать этот кусок кода?
Код:
  Pet *myPet = new Cat;
    myPet->feed();
Scratch вне форума Ответить с цитированием
Старый 28.09.2008, 17:15   #42
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Вот ты говоришь что я нелогично рассуждаю, ок, может быть ты покажешь как надо понимать этот кусок кода?
Код:
  Pet *myPet = new Cat;
    myPet->feed();
Код:
Pet *myPet = new Cat;
создаешь указатель на Pet, под названием myPet.
выделяешь память под экземпляр класса Cat и направляешь на него указатель myPet. (не забываем что Cat является "частью" класса Pet)
Код:
myPet->feed();
если объект feed() в исходном классе (т.е. Pet) обьявлен как виртуальный, и присутствует в порождённом классе, то:
компилятор посмотрит сначала присутствует ли такой метод в классе Pet, и если он присутствует, смотрит на его тип, если он виртуальный, посмотрит на что указывает указатель, если он указывает на порождённый класс, то он проверяет, обьявлен ли одноименный метод в нем, если обьявлен, то вызывает метод порожденного класса.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 17:20   #43
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вот зачем вдаваться в подробности как и что делает компилятор? Темболее откуда уверенность что компилятор делает именно так?
Между строк посмотрел статейку, в принципе вроде неплохо там всё описано, хотя псевдо код нужно писать не в синтаксисе языка, а то путаница одна получается. И могут возникнуть вопросы: зачем использовать классы, если компилятор приводит к структуре, в чём разница между структурой и классом и т.д. А учитывая, что в С++ структуры могут содержать методы...
pu4koff вне форума Ответить с цитированием
Старый 28.09.2008, 17:26   #44
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Темболее откуда уверенность что компилятор делает именно так?
так описано было в книге, да впрочем это и логично.
Цитата:
Сообщение от pu4koff Посмотреть сообщение
А учитывая, что в С++ структуры могут содержать методы...
о_0

ниразу не встречал. и mingw у меня матерился когда пытался такое написать.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 17:36   #45
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
ниразу не встречал. и mingw у меня матерился когда пытался такое написать.
Код:
struct A
{
	int b;
	int c;
	void f(){c = b;}
};
Вот такое в Visual C++ 2005 проходит. Стандарт С++ не изучал, так что не знаю какой из компиляторов тут не прав
pu4koff вне форума Ответить с цитированием
Старый 28.09.2008, 17:42   #46
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
Код:
Pet *myPet = new Cat;
создаешь указатель на Pet, под названием myPet.
выделяешь память под экземпляр класса Cat и направляешь на него указатель myPet. (не забываем что Cat является "частью" класса Pet)
Код:
myPet->feed();
То есть получается создаются две области памяти, для класса Pet и для классов Cat+Pet?
Scratch вне форума Ответить с цитированием
Старый 28.09.2008, 17:43   #47
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Код:
struct A
{
	int b;
	int c;
	void f(){c = b;}
};
Вот такое в Visual C++ 2005 проходит. Стандарт С++ не изучал, так что не знаю какой из компиляторов тут не прав
чисто из любопытства кинул твой пример в mingw
как ни странно, прокатило... наверно я когда в первые разы пытался - как-то скосячил.

признаю, был не прав.

p/s/ тему считаю исчерпаной.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 17:55   #48
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

В статье вводится понятие структуры просто как непрерывной области памяти, в которой хранятся определенные данные.

Цитата:
Стандарт С++ не изучал
В стандарте прописано, что методы могут быть.

Цитата:
Вот зачем вдаваться в подробности как и что делает компилятор?
Полезно для мозгов, к тому же без этого знания, например, трудновато будет понять особенности вызова виртуальных ф-ий в конструкторах и деструкторах.

Цитата:
Темболее откуда уверенность что компилятор делает именно так?
Абсолютной уверенности нет, ибо мало ли как компилятор написан, но технология мало чем отличается.

Код:
Pet *myPet = new Cat;
myPet->feed();
Если совсем коротко:
1) динамически выделяется память для объекта класса Cat
2) по очереди вызываются конструкторы классов Pet и Cat, в результате чего объект *myPet будет хранить где-то (чаще всего в начале) адрес таблицы виртуальных функций класса Cat
3) при компиляции компилятор в место вызова функции вставляет специальный код, который в ходе выполнения программы находит в таблице виртуальных функций адрес вызываемой функции и передает туда управление.

Цитата:
если объект feed() в исходном классе (т.е. Pet) обьявлен как виртуальный, и присутствует в порождённом классе, то...
Это ты только что придумал?
still_alive вне форума Ответить с цитированием
Старый 28.09.2008, 18:01   #49
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Это ты только что придумал?
это я так понимаю. если интересно, взгляни на листинг "калькулятора".
там чистые виртуальные функции. если их не обьявить во всех порожденных классах. то компилятор ругаться будет.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 18:05   #50
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Код:
Pet *myPet = new Cat;
myPet->feed();
Если совсем коротко:
1) динамически выделяется память для объекта класса Cat
2) по очереди вызываются конструкторы классов Pet и Cat, в результате чего объект *myPet будет хранить где-то (чаще всего в начале) адрес таблицы виртуальных функций класса Cat
3) при компиляции компилятор в место вызова функции вставляет специальный код, который в ходе выполнения программы находит в таблице виртуальных функций адрес вызываемой функции и передает туда управление.
?
1)Разве только для Cat? Но ведь Cat это саб класс Pet, значит туда войдут и переменные класса Pet?
2)У класса Cat нет виртуальных функций, они есть в Pet.
3)А вот тут по подробнее плиз, как это?
Scratch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
П Р О С Т Е Й Ш И Й пример 3D aesoem Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 16.07.2008 16:54
Пример из учебника valerij Microsoft Office Excel 11 20.06.2008 15:43
Пример патчинга Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.02.2008 19:27
пример парсинга Stanislav Общие вопросы Delphi 4 14.01.2008 03:48