![]() |
|
![]() |
Другие темы раздела | |
C++ Компилятор
https://www.cyberforum.ru/ cpp/ thread193991.html Здравствуйте. Пишу компилятор pas->asm на с++ Может кто-то подскажет генератор конструкцый или что-то подобное: <переменная1>+<переменная2> mov... |
C или C++(не холивар) C++ Здравствуйте. Участвую в различных олимпиадах по программированию, пишу обычно на C++, используя все его вкусности в виде STL, ООП, темплэйтов и проч. Накануне в двух задачах не уложился в... |
C++ x86 интерпретатор исходный код
https://www.cyberforum.ru/ cpp/ thread193279.html кто-нибудь слышал про интерпретаторы x86? в инете нарыл только что в qemu, bochs есть встроенные интерпретаторы команд x86 процессора, но пока не докопался до них. Нужно самому написать такой... |
C++ Крестики Нолики
https://www.cyberforum.ru/ cpp/ thread193237.html учу си месяц дали задачу... хелп ми плиз! Игра крестики нолики. Игра в крестики нолики вдется на квадратном поле 3*3. Играют двое. Начинают крестики. каждый из игроков, поочередно, ставит свой... |
Алгоритмы и программы по использованию указателей и динамических структур данных C++ Здравствуйте! Помогите, пожалуйста, написать задачу. Вот текст:Дан указатель P0 на один из элементов непустого двусвязного списка. Вывести число N — количество элементов в списке, а также указатели... |
C++ Функция rand
https://www.cyberforum.ru/ cpp/ thread193059.html Решить задачу с использованием библиотечной функции rand,заголовочный файл stdlib.h Случайные числа в диапазоне от -32768 до 32768 можно получить с помощью следуйщей фунции int casual () { ... |
C++ callback метода класса Предыстория: нужно последовательно запускать несколько однотипных циклов большой степени вложенности, в теле которых вызывать разные функции. Т.к. вроде бы переписывать циклы (тем более громоздкие... https://www.cyberforum.ru/ cpp/ thread192704.html |
кривой Безье C++ написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не знаю как сделать .... ил дайте ссылку на информацию как ее... |
C++ Выявление такого же ай-пи/мак адреса
https://www.cyberforum.ru/ cpp/ thread191681.html Усем здрасти!) имеется необходимость написать приложение, которое, бы присваивало ip адрес сетевой карте и менять ее мак-адресс. Но самое интересное, что приложение должно извещать пользователя о... |
C++ КНИГИ Подскажите харошую(лучшую) книгу по С++ ИЛИ Visual C++ Добавлено через 2 часа 45 минут Посрветуйте https://www.cyberforum.ru/ cpp/ thread191642.html |
C++ Использование данных из разных потоков Привет всем! Возникла проблема с использованием данных из разных потоков в многопоточном приложении 1) Допустим созданы два потока, которые создают некоторые переменные. Как потом подключиться... |
C++ Как достать архив из exe Короче, нужно засунуть архив в exe и при запуске программа должна вытащить этот архив на рабочий стол. Подскажите как это можно реализовать программно??? :wall: https://www.cyberforum.ru/ cpp/ thread191290.html |
![]() ![]() |
|
16.04.2011, 17:14 [ТС] | 0 |
Использование указателя на метод вместо виртуального метода - C++ - Ответ 155847416.04.2011, 17:14. Показов 5702. Ответов 45
Метки (Все метки)
Ответ
Мне кажется, что называть что-то извращением только потому, что ты чего-то не понял - это не правильно.
Общая постановка задачи. Есть чёрный ящик, в этот чёрный ящик надо отдать пару "указатель на экземпляр + указатель на метод". Вариант с классами Basi и Dervied я привёл условно, чтобы можно было описать пример того, что именно хочется сделать через указатель на метод. Для моего примера конечно же можно сделать вызов Exec, а потом вызов Tail1. Только это для упрощённой модели можно так просто сделать. Расширенный вариант выглядит так: в метод Exec тащится __closure-указатель (который есть пара "указатель на экземпляр + указатель на метод"). Внутри метода Exec создаётся поток, в потоке запускается программа, написанная на Lua, в неё передаётся моя пара, транзитно пролетает через коды на Lua и "внизу" вызывает код на Си++, который делает вызов через эту пару. Зачем так сложно? Любую сложный интерфейс, который взаимодействует с пользователем, можно написать двумя способами. Первый способ заключается в том, чтобы реализацию интерфейса сделать простой, сам интерфейс не очень удобный для пользователя и переложить все свои проблемы на плечи пользователя. Второй способ заключается в том, что реализацию интерфейса сделать сложной, но при этом получив простой интерфейс, который будет удобным в использовании. Я всегда иду по второму пути (если это возможно) Пример неудобного в использовании интерфейса: борландовский класс TThread. Чтобы им пользоваться. надо определить свой класс, который является производным классом от TThread, переопределить метод Execute, реализовать событие OnTerminate, в своём основном классе обеспечить возможность для доступа ко внутренним данным и методам (потому что часть, исполняемая в потоке, реализована в другом классе). Для маленькой программы конечно же это всё сойдёт, но когда пишешь что-то большое - то разводится очень много мусора вокруг создания потока. Оговорюсь сразу, что это не претензия к борланду: этот класс является лишь некоторым классом низкого уровня, над которым пользователь будет строить обёртку, удобную в конкретной программе. Просто пытался показать пример неудобного интерфейса и как его сделать удобным Удобным в использовании была бы надстройка над таким интерфейсом. К нашему классу (с которым мы работаем и который будет рожать поток) нам нужно добавить в родители некий базовый класс, а в момент рождения потока дёрнуть метод с прототипом типа "StartThread (f1, f2)", где f1 - это указатель на метод, который будет запущен при старте потока, f2 - указатель на метод, который будет запущен в главном процессе после завершения потока. Такой интерфейс очевидным образом использовать намного удобнее Вернуться к обсуждению: Использование указателя на метод вместо виртуального метода C++
0
|
|
16.04.2011, 17:14 | |
Готовые ответы и решения:
45
Вызов виртуального метода базового класса из указателя производного Почему при переопределении виртуального метода в производном классе выводится метод базового? Использовать метод transform() вместо метода sort()
|
16.04.2011, 17:14 | |
Помогаю со студенческими работами здесь
0
Переопределение виртуального метода переопределение виртуального метода Ошибка создания виртуального метода? Реализовать перегрузку виртуального метода |