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

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

04.12.2019, 10:37. Показов 4432. Ответов 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
6353 / 3524 / 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
13.02.2020, 21:35
Лучший ответ Сообщение было отмечено d7d1cd как решение

Решение

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

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

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

Но вообще, кажется, вы меня невнимательно читаете. Я писал:
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вам условия позволяют так делать - делайте
Это значит, что ограничения выбранного вами способа будут важны только в определенных условиях. Например, если вы пишете библиотеку, то вы не можете игнорировать многопоточность, потому что не знаете будет ли пользователь библиотеки использовать эту функцию из разных потоков или нет. В этом случае либо придется давать гарантии в реализации, и\или отражать в документации особенности работы в многопоточной среде.
Тоже самое касается времени жизни. Пользователя библиотеки может не устроить, что объект живет до конца программы. В этом случае все равно придется предоставлять функцию удаления по требованию.
Ну и т.д.
Если вы воспринимаете мои посты как догмы или как 100% точные описания явлений, то зря. Я просто даю вам пищу для размышлений. Дальше вы сами решайте.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 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
8489 / 6156 / 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
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 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
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru