|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
Сохранение указателя на функцию класса04.12.2019, 10:37. Показов 4447. Ответов 51
Метки нет (Все метки)
Приветствую всех. Пытаюсь сохранить указатель на функцию класса, получаю ошибку. Расскажите, как сделать то, что мне надо?
0
|
||||||
| 04.12.2019, 10:37 | |
|
Ответы с готовыми решениями:
51
Передача указателя на функцию-член класса Хранение в map указателя на функцию-член шаблонного класса Создание указателя на экземпляр класса, описанного после объявления указателя |
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||
| 06.12.2019, 15:00 [ТС] | ||||||
|
DrOffset, спасибо за код.
Я правильно понимаю, что его использовать надо так:
0
|
||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
||
| 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
|
||||||
|
фрилансер
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,356
|
|
| 07.02.2020, 11:53 | |
|
d7d1cd, убери круглые скобки в 22 строке
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||
| 07.02.2020, 11:59 [ТС] | |||||||
0
|
|||||||
|
фрилансер
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,356
|
||
| 07.02.2020, 12:06 | ||
|
насчёт скобок - если ругалось на эту строку return new IFile();, то компилятор думает, что тут хотят объявить функцию. Поэтому скобки нужно убратьхотя, вот именно в этой строке и есть использование ![]() тело этой функции нужно перенести в cpp
0
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
|||||||
| 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
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
||
| 07.02.2020, 12:36 | ||
|
Для того, чтобы так думать, нужен неоднозначный синтаксис. А тут все однозначно.
0
|
||
|
фрилансер
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,356
|
|
| 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
|
||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
|||||||||||||
| 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
|
||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
|
| 07.02.2020, 14:05 | |
|
d7d1cd, я нормально смотрю. Если вам условия позволяют так делать - делайте
![]() Про ограничения этого способа для общего случая вы наверное и сами знаете. Если они вам не мешают, почему бы и нет?
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 07.02.2020, 14:07 [ТС] | |
|
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
|
|
| 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 функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|