Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Компилятор https://www.cyberforum.ru/ cpp/ thread193991.html
Здравствуйте. Пишу компилятор pas->asm на с++ Может кто-то подскажет генератор конструкцый или что-то подобное: <переменная1>+<переменная2> mov...
C или C++(не холивар) C++
Здравствуйте. Участвую в различных олимпиадах по программированию, пишу обычно на C++, используя все его вкусности в виде STL, ООП, темплэйтов и проч. Накануне в двух задачах не уложился в...
x86 интерпретатор исходный код C++
кто-нибудь слышал про интерпретаторы x86? в инете нарыл только что в qemu, bochs есть встроенные интерпретаторы команд x86 процессора, но пока не докопался до них. Нужно самому написать такой...
C++ Крестики Нолики учу си месяц дали задачу... хелп ми плиз! Игра крестики нолики. Игра в крестики нолики вдется на квадратном поле 3*3. Играют двое. Начинают крестики. каждый из игроков, поочередно, ставит свой... https://www.cyberforum.ru/ cpp/ thread193237.html
C++ Алгоритмы и программы по использованию указателей и динамических структур данных https://www.cyberforum.ru/ cpp/ thread193137.html
Здравствуйте! Помогите, пожалуйста, написать задачу. Вот текст:Дан указатель P0 на один из элементов непустого двусвязного списка. Вывести число N — количество элементов в списке, а также указатели...
Функция rand C++
Решить задачу с использованием библиотечной функции rand,заголовочный файл stdlib.h Случайные числа в диапазоне от -32768 до 32768 можно получить с помощью следуйщей фунции int casual () { ...
C++ callback метода класса
Предыстория: нужно последовательно запускать несколько однотипных циклов большой степени вложенности, в теле которых вызывать разные функции. Т.к. вроде бы переписывать циклы (тем более громоздкие...
C++ кривой Безье написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не знаю как сделать .... ил дайте ссылку на информацию как ее... https://www.cyberforum.ru/ cpp/ thread192259.html
C++ Выявление такого же ай-пи/мак адреса https://www.cyberforum.ru/ cpp/ thread191681.html
Усем здрасти!) имеется необходимость написать приложение, которое, бы присваивало ip адрес сетевой карте и менять ее мак-адресс. Но самое интересное, что приложение должно извещать пользователя о...
C++ КНИГИ Подскажите харошую(лучшую) книгу по С++ ИЛИ Visual C++ Добавлено через 2 часа 45 минут Посрветуйте https://www.cyberforum.ru/ cpp/ thread191642.html
Evg
Эксперт CАвтор FAQ
21146 / 8162 / 628
Регистрация: 30.03.2009
Сообщений: 22,463
Записей в блоге: 30
17.04.2011, 10:13  [ТС] 0

Использование указателя на метод вместо виртуального метода

17.04.2011, 10:13. Просмотров 5496. Ответов 45
Метки (Все метки)

Ответ

Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, Используя расширения языка для конкретного компилятора писать код - плохая затея
Расширение используется только на входе и выходе цепочки. Эти классы так или иначе являются компонентами VCL. А в серединке делается транзитная передача данных, которая от расширений языка не зависит (т.е. ей дали какой-то набор байтов, и этот набор просто скопировался)

Цитата Сообщение от ForEveR Посмотреть сообщение
Если тебе нужен только borland то и не парься, используй closure.
Я не парюсь. Человек не понял, а я ему объясняю. Причём объясняю не решение, а поставленный вопрос.

Цитата Сообщение от Deviaphan Посмотреть сообщение
Класс Base является базовым не для A и B, а для функтора. Иерархия A и B и прочих не изменяется. Раз BlackBox пишешь ты, то ничто не мешает заменить void* на Base*. Плюс ты получаешь бонус в виде возможности использовать различные типы и количество параметров для вызывемой метода и вызов более одного метода класса.
Библиотека ничего о пользовательских классах знать не будет, она будет знать только об интерфейсе функтора Base и всё.
Ты напиши исходник хотя бы схематично, а не на словах объясняй. И, как я уже неоднократно объяснял, сделай это без шаблонов

Цитата Сообщение от ValeryS Посмотреть сообщение
Evg,
еще раз повтори(много написано запутался)
чем тебя не устраивает Callback?
для таких вещей по моему он и создан.
что значит неправильный this?
Не тот класс? Не тот экземпляр?

и чем не устраивают Мессаги?
Может я плохо выразился. Заставить свои коды работать я могу всегда. И всегда могу придумать с десяток решений: от идиотских до черезж...ых. В данном случае я пытаюсь найти решение, которое было бы максимально удобным для пользователя.

Давай вернёмся к примеру из последнего абзаца поста #24. Постановка задачи, например, такая. Пользователь пишет класс окна (TForm). Нужно скачать из инета картинку и отобразить её на форме. Если скачивание выполнять в главном процессе, то в момент скачивания приложение будет "висеть": т.е. оно никак не будет реагировать на нажатия кнопок, не будет перерисовываться если поверх него протащить другое окно и т.п. Чтобы этого избежать, надо процесс скачивания утащить в поток. Пока картинка скачивается в потоке, приложение живёт своей жизнью: реагирует на нажатия на кнопочки, менюшки и прочие события. Как только картинка скачалась, то главный процесс каким-то образом об этом узнает и вызовет код, который отрисует картинку на форму (потому что из потока рисовать нельзя). Как такой набор действий сделать максимально удобным для пользователя? У меня работает следующий вариант. Всё то, что начинается с User - это то, что пишет пользователь, а с Lib - это библиотека. Схематично:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class UserForm : public LibForm
{
  ...
 
  void UserGetImage (void)
  {
    LibStartThread (UserDownloadImage, UserDisplayImage);
  }
 
  void UserDownloadImage (void)
  {
    // Скачивание картинки (в потоке)
  }
 
  void UserDisplayImage (void)
  {
    // Отрисовка картинки (в главном процессе)
  }
}
Т.е. для того, чтобы работать с потоками, пользователю необходимо всего два дополнительных действия, которые являются максимально примитивными: добавить в родителя класс LibForm и поставить вызов библиотечного метода LibStartThread, подав параметрами указатели на собственные методы UserDownloadImage и UserDisplayImage. Эти два собственных метода так или иначе пришлось бы реализовывать, а потому они практически не являются дополнительными действиями. Каким образом библиотечный метод LibStartThread обеспечит вызов UserDownloadImage в потоке, дальнейший выход из себя (т.е. после запуска потока работа UserGetImage завершится и приложение начнёт обрабатывать сообщения) и вызов UserDisplayImage в главном процессе после завершения работы потока - это исключительно проблема библиотеки и пользователя она никоим боком не колышет. И речь об этом сейчас не идёт. Речь идёт только о том, каким образом организовать максимально удобный для пользователя интерфейс (разумеется, в пределах того, что позволяет язык)

Если ты можешь предложить что-то более удобное для пользователя (а не для того, кто будет библиотеку поддержки реализовывать) - предложи

Добавлено через 44 секунды
И заодно объясни, что такое Callback

Добавлено через 10 минут
Да, вот ещё. Библиотека поддерживает возможность работы без потока. Т.е. LibStartThread может запустить UserDownloadImage и UserDisplayImage последовательно в главном процессе - сие удобно для процесса отладки, если возникает подозрение, что проблема обусловлена работой с потоком. Переключение между двумя режимами опять-таки делается одним лёгким движением руки

Вернуться к обсуждению:
Использование указателя на метод вместо виртуального метода
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2011, 10:13
Готовые ответы и решения:

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() {...

Почему при переопределении виртуального метода в производном классе выводится метод базового?
Всем добра! Помогите разобраться почему при переопределении виртуального метода в производном...

Использовать метод transform() вместо метода sort()
Добрый день , надо исправить код , заменив метод sort() , методом transform(), не могу уловить...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

45
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.