|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Сохранение указателя на функцию класса04.12.2019, 10:37. Показов 4483. Ответов 51
Метки нет (Все метки)
Приветствую всех. Пытаюсь сохранить указатель на функцию класса, получаю ошибку. Расскажите, как сделать то, что мне надо?
0
|
||||||
| 04.12.2019, 10:37 | |
|
Ответы с готовыми решениями:
51
Передача указателя на функцию-член класса Хранение в map указателя на функцию-член шаблонного класса Создание указателя на экземпляр класса, описанного после объявления указателя |
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 06.12.2019, 15:00 [ТС] | ||||||
|
DrOffset, спасибо за код.
Я правильно понимаю, что его использовать надо так:
0
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 06.12.2019, 15:37 | ||
|
Там нужна еще функция освобождения объекта (я думаю вы это и так поняли, но на всякий случай упомяну).
1
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 06.12.2019, 15:48 [ТС] | ||
|
Но вот мне кажется этот код несколько неудобным... Надо переспать с ним Спасибо еще раз!
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 07.02.2020, 11:46 [ТС] | ||||||
|
DrOffset, попробовал сделать программу по Вашему примеру. Для упрощения убрал проверки и функцию открытия. Приведу код:
IFile * createIFile();: Syntax error: possible missing '{'?, а так же Definition of function IFile requires parentheses.
0
|
||||||
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
|
|
| 07.02.2020, 11:53 | |
|
d7d1cd, убери круглые скобки в 22 строке
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||
| 07.02.2020, 11:59 [ТС] | |||||||
0
|
|||||||
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
|
||
| 07.02.2020, 12:06 | ||
|
насчёт скобок - если ругалось на эту строку return new IFile();, то компилятор думает, что тут хотят объявить функцию. Поэтому скобки нужно убратьхотя, вот именно в этой строке и есть использование ![]() тело этой функции нужно перенести в cpp
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 07.02.2020, 12:34 | |||||||
|
Добавлено через 2 минуты Если на С, то заголовочный файл должен быть такой:
1
|
|||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 07.02.2020, 12:35 [ТС] | |
|
Алексей1153, еще раз: модуль со строкой
return new IFile(); компилируется!
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 07.02.2020, 12:36 | ||
|
Для того, чтобы так думать, нужен неоднозначный синтаксис. А тут все однозначно.
0
|
||
|
фрилансер
6504 / 5748 / 1134
Регистрация: 11.10.2019
Сообщений: 15,392
|
|
| 07.02.2020, 12:39 | |
|
d7d1cd, ну и отлично
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 07.02.2020, 13:26 [ТС] | ||
struct. Хотя можно сделать typedef.По поводу того, что надо еще сделать закрытие файла (по сути вызов оператора delete для указателя на IFile). Я правильно понимаю, что здесь только вручную это делать? Ведь если в С коде указатель на IFile выйдет из области видимости, то это никак нельзя отследить автоматически?
0
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||||||||
| 07.02.2020, 13:44 | |||||||||||||
Добавлено через 3 минуты Добавлено через 5 минут В GCC есть расширение компилятора, которое позволяет задать "очищающую" функцию. Выглядит это примерно так:
1
|
|||||||||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 07.02.2020, 14:01 [ТС] | ||||||
|
У меня не GCC...
DrOffset, а как Вы смотрите на такой вариант. В CPP модуле создаем глобальный вектор. В функции createIFile объект IFile создаем на стеке (в принципе, этот класс создан так, чтобы можно было его экземпляры создавать на стеке: он сам размещает свои данные в куче и в деструкторе освобождает их), помещаем его в вектор и возвращаем на него указатель. Когда при завершении программы вектор начнет разрушаться, он вызовет деструкторы у его элементов.
0
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 07.02.2020, 14:05 | |
|
d7d1cd, я нормально смотрю. Если вам условия позволяют так делать - делайте
![]() Про ограничения этого способа для общего случая вы наверное и сами знаете. Если они вам не мешают, почему бы и нет?
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 07.02.2020, 14:07 [ТС] | |
|
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 07.02.2020, 14:32 | |
|
d7d1cd,
1) время жизни всех объектов - очень длинное, это может мешать логике вызывающей стороны; 2) если эта функция используется конкуррентно, то нужна сихронизация. А в однопоточном варианте - синхронизация будет замедлять работу; 3) отсутствие ожидаемого поведения. Ресурс возвращен, но тот, кто его получил, им не владеет.
1
|
|
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||||
| 12.02.2020, 10:05 | ||||||
|
d7d1cd, добавлю:
Не по теме: Хотя это наверное то, что имелось ввиду в п.3 предыдущего поста :)
2
|
||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 12.02.2020, 15:00 [ТС] | ||||||
|
zayats80888, да, Вы правы... Печалька, ибо использование классов из С-кода затевалось в том числе для того, чтобы не париться с закрытием файлов...
А что если (щас попрет настоящий говнокод )...Что если в С++ модуле наряду с вектором файлов завести счетчик созданных файлов. А в С модуль возвращать номер файла в векторе. Вот такое чудо получается:
0
|
||||||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 12.02.2020, 15:25 | ||
|
d7d1cd, что бы избежать реаллокации - самое простое, заменить вектор на какой нибудь std::list
1
|
||
| 12.02.2020, 15:25 | |
|
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|