![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Mayene |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.8.2005 Репутация: нет Всего: нет |
В документации структуры данных описана функция
virtual bool Struct_Base::GetCellInfo (int cID, int *& pID, cmdreal *& coor, cmdreal *& changes) [pure virtual] Параметры: cID [IN], pID [INOUT] - указатель типа int coor [INOUT], charges [INOUT] - указатель типа cmdreal Эта функция привызове дает cID, pID, coor, charges. Вопрос: как корректно вызвать эту функцию в программе. (Не сильна в синтаксисе..) Это сообщение отредактировал(а) Mayene - 8.8.2005, 12:53 |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Это чисто виртуальная функция, ее можно вызывать только в том случае если у нее есть тело,
и только в производных от Struct_Base классах и только статически. Вот так Struct_Base::GetCellInfo(/*...*/); (ИМХО) --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Ну вот так:
Главное, нельзя писать так:
указатели должны быть переменными, раз передается ссылка на них Добавлено @ 12:58 Только в производных - согласен. Хотя это, в принципе, не обязательно. Функция ведь абстрактной не объявлена. Но почему только статически?? Это сообщение отредактировал(а) comcon1 - 8.8.2005, 14:09 |
||||
|
|||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
2comcon1 Там написано [pure virtual]. У чисто виртуальных функций может быть тело (а может и не быть), если есть то вызывать можно только через квалификатор Struct_Base:: если не ошибаюсь. Статически - потому что для чисто виртуальных функций виртуальный механизм не работает.
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Mayene |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.8.2005 Репутация: нет Всего: нет |
comcon1
Т.е. я этот Object_name тоже должна сначала объявить? Что-то вроде:
Поправьте, пожалуйста, где не права... P.S. Я на Delphi больше 3 лет работала, в C++ только осваиваюсь... Простите, если что не так... |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Mayene,
ты лучше по-подробнее расскажи: что за функция, откуда надо вызывать и зачем, и приведи код где у тебя выдается ошибка... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
2 LPBOY. Спасибо буду знать.
2 автор. Да, ты дала слишком мало инфо. |
|||
|
||||
| Mayene |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.8.2005 Репутация: нет Всего: нет |
LPBOY
У меня физико-математический проект. В настоящий момент все, что наработано, нужно запрограммировать. К моему сожалению... на С++. У проекта уже есть готовое описание структуры данных. Т.е. мне нужно плавно влиться в то, что есть. А именно.... К описанию выше обозначенной функции
приделано следующее описание: Вызывая эту функцию, ID, координаты и заряды всех частиц внутри клетки (молекулярная динамика) возвращаются. В параллельном варианте это работает только для клеток, которые существуют на данном процессе. (Параллельное мне пока не нужно Ну коротко и все. Теперь мне эту функцию нужно корректно вызвать. Т.е. вызвать таким образом, чтобы у меня сформировался массив данных, каждый элемент массива - т.н. клетка с номером, координатами и зарядами... |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
А особенно вот это: для чисто виртуальных функций виртуальный механизм не работает -- БРЕД. Извини, но это, действительно, редкостный бред. Mayene
object_name в том примере должен быть указателем на Struct_Base (или на производный он класс). -------------------- Да. Именно так. |
||||
|
|||||
| Mayene |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.8.2005 Репутация: нет Всего: нет |
Файл, в котором лежит эта функция, выглядит так:
|
|||
|
||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Итак. Чтобы её вызвать тебе во-первых нужен объект класса, производного от Struct_Base. В примере comcon1 на этот объект указывает указатель object_name, который должен быть объявлен примерно так: Struct_Base *object_name; Теперь пишем так (как и сказал comcon1):
Вместо object_name будет тот указатель на объект, который у тебя есть. Добавлено @ 13:47 Mayene
Реально там нет этой функции. Ведь там написано = 0, а это значит, что GetCellInfo -- это чисто виртуальная функция, которая должна быть переопределена в производных классах. Это сообщение отредактировал(а) Дрон - 8.8.2005, 13:50 -------------------- Да. Именно так. |
||||||
|
|||||||
| Mayene |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.8.2005 Репутация: нет Всего: нет |
Дрон
Спасибо огромное за доходчивое объяснение! Очень признательна! |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Ты уверена что у этой функции есть тело?? Если "да", тогда:
Очень важный момент: откуда ты ее хочешь вызвать??? Если из main то не получиться, по крайней мере напрямую, а если из функции-члена производного класса, то через квалификатор :: базового. А может это чисто вирт. функция без тела? Тогда тебе надо ее вызывать через объекты производных классов. Короче нужна еще информация... Сейчас я еще напишу несколько примерчиков, подожди... 2Дрон, ты не прав, тебе отвечу позже... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
2 дрон. быстро исправил! тока хотел написать про ошибку.
|
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Да, я не заметил сначала, что 2-й параметр тоже по ссылке передаётся Добавлено @ 13:58 LPBOY Чисто виртуальная функция для того и придумана, чтобы определить некий интерфейс к объекту. Если у нас есть
-------------------- Да. Именно так. |
||||
|
|||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Если нужно вызвать ЧИСТО ВИРТУАЛЬНУЮ ФУНКЦИЮ в БАЗОВОМ классе, то надо так:
Если ПЕРЕОПРЕДЕЛЕННУЮ из ПРОИЗВОДНОГО класса, то так:
2Дрон Указатели на чисто виртуальные функции (а не переопределенные), в VTBL не помещаются!!! Это сообщение отредактировал(а) LPBOY - 8.8.2005, 15:58 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
ОФФТОП: Кстати я и не знал, что [pure virtual] и [abstract] это один и тот же термин.
Это чисто Сишный, что ли термин? Ведь в паскале прямо ключевое слово abstract есть. |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
LPBOY
Что-то я тебя не понимаю. В первом примере, например, ты вообще непонятно что делаешь.
А зачем кому-то в здравом уме вызывать чисто виртуальную функцию???? Вызывают всегда переопределённые, а чисто виртуальная функция это только интерфейс, который служит для обобщения правил доступа к производным классам. О чём спор? Добавлено @ 14:15 comcon1
Вроде да. В Java и С# тоже используется термин abstract. Это сообщение отредактировал(а) Дрон - 8.8.2005, 14:16 -------------------- Да. Именно так. |
||||
|
|||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Чисто виртуальные функции используются для определения поведения по умолчанию, например. Не я их придумал... Я просто подумал что ей надо вызвать именно чисто виртуальную функцию из самого базового класса.
Спор о том что ты в ответ на мой пост, в котором я сказал что чисто вирт. ф-ии вызывать можно и что только статически, сказал, что это бред. Приведи аргументы, в таком случае... --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
LPBOY
Создай лучше отдельную тему. И опиши свои "претензии" И ещё, я не совсем понимаю твою терминологию. Что значит вызывать чисто виртуальные функции? Что, в этом контесте, значит вызывать статически?
Какого ещё поведения по умолчанию, если у них нет тела??? -------------------- Да. Именно так. |
|||
|
||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Это значит вызывать функции корорые объявлены таким образом: virtual void f()=0; а не те которые переопределены в производных классах.
В этом контексте и не только в этом "статически" оэначает во время компиляции, а обычные вирт. ф-ии связываются во время выполнения.
Опять 25. Тело может быть - смотри мой первый пример!!! P.S. Ты че издеваешься надо мной? --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Чисто вирт. функции ничем не отличаются от "обычных" виртуальных. Они тоже связываются во время выполнения. По-моему, разницу можно заметить только попытавшись вызвать чисто вирт. функции в конструкторе базового класса (там механизм виртуальности не сработает, т.к. объект ещё не инициализирован, и выведет "pure virtual function call").
Пойдём другим путём Скажи, будет ли работать этот пример:
Или я просто не понимаю о чём ты говоришь?? -------------------- Да. Именно так. |
||||||
|
|||||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
ДАА!!!
Первый пример его работает!! Тока что скомпилил. То есть абстрактные функции могут иметь тела, но вызываться тело будет только статически. Круто!!! |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Мне без разницы будет ли он работать. Ты вызови именно ЧИСТО виртуальную функцию динамически, а не переопределенную... Добавлено @ 14:55 Спасибо большое comcon1, хоть кто-то поверил --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Забавно. Это называется pure virtual function with a body. В нормальных условиях не используется Добавлено @ 15:02 LPBOY
Не надо кричать. Надо просто уметь изъясняться так, чтобы и остальным было понятно Разве не чувствуешь разницы: "чисто виртуальная функция" и "чисто виртуальная функция с телом". -------------------- Да. Именно так. |
||||
|
|||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Ты меня сначала до нервного срыва довел, а теперь говоришь "не надо" кричать
(У меня две операционки в одной не работает инет, а в другой VC - благодаря тебе я последний час туда-сюда грузился как сумасшедший
Кто бы говорил Ладно надеюсь этот спор закончен... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
аминь
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
LPBOY
Признаю, что проглядел в твоём примере, что тело-то определено. Это настолько редкая фишка (и ИМХО нафиг не нужная), что я долго врубится не мог Как-то я невнимательно читаю... Видимо, фраза "для чисто виртуальных функций виртуальный механизм не работает" шокировала меня настолько, что остальное я и не заметил -------------------- Да. Именно так. |
|||
|
||||
| CoreDumped |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 1.8.2005 Репутация: нет Всего: 1 |
абстрактным должен объявляться базовый клас а не функция. Класс, который имеет хотябы одну чистую виртуальную функцию является абстрактным и может использоваться только при наследовании. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Я просто не знал, что pure virtual и abstract - одно и то же.
Вообще все, вроде разрулилось, правда мы долго не могли воткнуть, что абстрактные функции могут иметь тело |
|||
|
||||
| CoreDumped |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 1.8.2005 Репутация: нет Всего: 1 |
Это не совсем одно и тоже (хотя смысловые выражения абстрактный и чистый пересекаются и обеспечивают абстрактные базовые классы и чистые виртуальные функции один механизьм) тут слово "чистый" относится к виртуальной функции, а "абстрактный" к класу, содержащему такую функцию. И термин отнюдь не сишный а с++ (механизьмы наследования и виртуальные функции определены в с++) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Дальний указатель на мальчика (LPBOY) прав, хотя и не совсем ясно выражается.
Чисто-виртуальная функция может иметь тело, а может не иметь - как вам больше нравится. "=0" в конце объявления просто делает класс абстрактным, и требует, чтобы данная функция была переопределена в инстационируемых наследниках. Насчет полезности... ну, кто-то из гуру приводил такой пример: нужно сделать класс абстрактным, а объявить чисто-виртуальным нечего (все функции делают что-то полезное). Выход - объявляем любую из них или все чисто виртуальными; вызывать их из производных классов по-прежнему можно, как обычно - base_class::func(), т.е. со статической компоновкой. Видимо, это и имел в виду LPBOY: невиртуальная функция вполне может не иметь тела, и все будет хорошо, пока вы ее не вызываете. -------------------- ... |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Я, кстати, его ник так же читаю
Всё равно извращение. -------------------- Да. Именно так. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |