Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712

Сохранение указателя на функцию класса

04.12.2019, 10:37. Показов 4147. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех. Пытаюсь сохранить указатель на функцию класса, получаю ошибку. Расскажите, как сделать то, что мне надо?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int (*globalGet)();
 
class A
{
  public:
  A() {
    m_Var = 7;
    globalGet = get; /* cannot convert ‘A::get’ from type ‘int (A::)()’ to type ‘int (*)()’ */
  }
  
  int get() {
    return m_Var;  
  }
 
  private:
  int m_Var;
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2019, 10:37
Ответы с готовыми решениями:

Передача указателя на функцию-член класса
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл main.cpp #include "head.hpp" ...

Хранение в map указателя на функцию-член шаблонного класса
Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются между собой сообщениями используя их...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; class B{ public:

51
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
12.02.2020, 15:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если вас устраивает, то можно так.
Хочется услышать про недостатки этого способа...

Сейчас экспериментирую и захотел изменить функцию CreateFile так, чтобы она возвращала константу (то есть для того, чтобы пользователь случайно не смог изменить полученный идентификатор файла). Написал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// В "общем" H-файле --------------------------
 ...
const unsigned int CreateFile();
 ...
 
// В СPP файле ----------------------------------------
 ... 
const unsigned int CreateFile()
{
  files.push_back(IFile());
  return index++;
}
 ...
Данный код компилируется.
Далее написал код проверки в С модуле:
C++
1
2
3
4
5
6
#include "header.h"
 
int main()
{
  const unsigned int iFile = CreateFile();
}
Но этот модуль не прошел компиляцию. Ошибка появилась в файле header.h на строке const unsigned int CreateFile();. Сообщение об ошибке: Function cannot return a const qualified type.. Объясните, пожалуйста...
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
12.02.2020, 16:10
Цитата Сообщение от d7d1cd Посмотреть сообщение
Хочется услышать про недостатки этого способа...
Я не программист. Кто нить другой пускай рассказывает.
Цитата Сообщение от d7d1cd Посмотреть сообщение
то есть для того, чтобы пользователь случайно не смог изменить полученный идентификатор файла
возвращается значение, меняй не меняй - что изменится? Так же можно скопировать значение в не-константу и изменить...
Цитата Сообщение от d7d1cd Посмотреть сообщение
Сообщение об ошибке: Function cannot return a const qualified type.. Объясните, пожалуйста...
Это нужно в С стандарт смотреть, похоже нельзя квалифицировать константой возвращаемое значение.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.02.2020, 17:39
Цитата Сообщение от d7d1cd Посмотреть сообщение
чтобы пользователь случайно не смог изменить полученный идентификатор файла
Но тогда пользователь не сможет и команду записи применить к этому файлу.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
13.02.2020, 07:55  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Но тогда пользователь не сможет и команду записи применить к этому файлу.
С чего это???
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.02.2020, 14:19
Цитата Сообщение от zayats80888 Посмотреть сообщение
похоже нельзя квалифицировать константой возвращаемое значение.
Можно, но это не имеет смысла. Поэтому функции const int foo() и int foo() - эквивалентны.

Цитата Сообщение от d7d1cd Посмотреть сообщение
то есть для того, чтобы пользователь случайно не смог изменить полученный идентификатор файла
Никто ему не запретит сделать так:
C++
1
unsigned int iFile = CreateFile();
const или не-const возвращает CreateFile - не важно.

Добавлено через 1 минуту
Цитата Сообщение от d7d1cd Посмотреть сообщение
Печалька, ибо использование классов из С-кода затевалось в том числе для того, чтобы не париться с закрытием файлов...
Дотаточно использовать std::list вместо std::vector конкретно этой проблемы не будет.
1
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
13.02.2020, 14:45  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Дотаточно использовать std::list вместо std::vector конкретно этой проблемы не будет.
Опять незнание стандартной библиотеки возвращает меня к началу
DrOffset, если не затруднит, скажите, какие проблемы появятся, если использовать std::list?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.02.2020, 16:07
Цитата Сообщение от d7d1cd Посмотреть сообщение
если не затруднит, скажите, какие проблемы появятся, если использовать std::list?
Те, что уже были озвучены мной выше никуда не денутся. Решится только проблема с аллокациями.
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
13.02.2020, 16:23  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Те, что уже были озвучены мной выше никуда не денутся. Решится только проблема с аллокациями.
Цитата Сообщение от DrOffset Посмотреть сообщение
1) время жизни всех объектов - очень длинное, это может мешать логике вызывающей стороны;
2) если эта функция используется конкуррентно, то нужна сихронизация. А в однопоточном варианте - синхронизация будет замедлять работу;
3) отсутствие ожидаемого поведения. Ресурс возвращен, но тот, кто его получил, им не владеет.
Честно, не совсем понял .
Пункт 1. Здесь имеется ввиду, что все объекты будут храниться (теперь) в списке все время работы программы? В чем здесь может быть проблема?
Пункт 2. У меня однопоточный вариант. О какой синхронизации идет речь?
Пункт 3. Почему тот, кто получил ресурс, им не владеет? Ведь можно создать функцию удаления. Она закроет файл и удалит его из списка.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.02.2020, 21:35
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

Цитата Сообщение от d7d1cd Посмотреть сообщение
Здесь имеется ввиду, что все объекты будут храниться (теперь) в списке все время работы программы? В чем здесь может быть проблема?
Проблема в том, что время жизни объектов файлов (при условии, что мы останавливаемся на варианте удаления объектов в конце работы программы) может быть неадекватно большим. Это проблема в случае, если вызывающей стороне нужно время жизни меньше, чем работа всей программы.

Цитата Сообщение от d7d1cd Посмотреть сообщение
У меня однопоточный вариант. О какой синхронизации идет речь?
О синхронизации доступа к списку\вектору. Если у вас всегда однопоточный вариант, то для вас это не актуально.

Цитата Сообщение от d7d1cd Посмотреть сообщение
Ведь можно создать функцию удаления.
Чем это будет отличаться тогда от первоначального варианта без списков и векторов?

Но вообще, кажется, вы меня невнимательно читаете. Я писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вам условия позволяют так делать - делайте
Это значит, что ограничения выбранного вами способа будут важны только в определенных условиях. Например, если вы пишете библиотеку, то вы не можете игнорировать многопоточность, потому что не знаете будет ли пользователь библиотеки использовать эту функцию из разных потоков или нет. В этом случае либо придется давать гарантии в реализации, и\или отражать в документации особенности работы в многопоточной среде.
Тоже самое касается времени жизни. Пользователя библиотеки может не устроить, что объект живет до конца программы. В этом случае все равно придется предоставлять функцию удаления по требованию.
Ну и т.д.
Если вы воспринимаете мои посты как догмы или как 100% точные описания явлений, то зря. Я просто даю вам пищу для размышлений. Дальше вы сами решайте.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.02.2020, 19:55
Кстати почему никто не сказал про std::function и умные указатели для файлов?
0
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
16.02.2020, 13:38  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати почему никто не сказал про std::function и умные указатели для файлов?
Ну уж если начали, то расскажите
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.02.2020, 17:15
Так а что рассказывать тема заезженная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2020, 17:15
Помогаю со студенческими работами здесь

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

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Вызов методов класса из двойного указателя на экземпляр класса
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ?
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru