rusbaron
@rusbaron
Не стыдно не знать, стыдно не интересоваться

Как правильно вызвать функцию другого класса?

Доброго дня!Есть проблема, пытаюсь передать адрес функции класса в другой класс,для последующего вызова,но не знаю как вызвать.
Есть функция класса InventoryContainer
void deleteAllItems(unsigned int UICell);
В другом классе я создаю указатель для этой функции.
void(InventoryContainer::*fnDelete)(unsigned int);
Но при попытке вызвать эту функцию,
this->fnDelete(this->IFrom);
студия показывает мне что this в данном случае не корректен.
По этому случаю несколько вопросов:
  1. Как правильно вызвать функцию?
  2. Где то на StackOverflow видел,что для вызова такой функции нужен ещё объект.Не лучше ли тогда просто передать ссылку на объект и через него и вызвать функцию?
  3. Где можно поподробнее почитать про callback функции,зачем это надо и как это используют?


Заранее спасибо!
  • Вопрос задан
  • 3075 просмотров
Решения вопроса 2
MrNexeon
@MrNexeon
Это называется функция обратного вызова, или Сallback

Существует достаточно много способов для реализации коллбеков, но самым современным решением в C++ является функтор.

Функтор, или функциональный объект - это просто класс с перезагруженным оператором (). Стандартная библиотека уже включает в себя интерфейс для удобного создания и использования функторов - std::function

В действии:

#include <functional>

void deleteAllItems(int); // <- функция, которую нужно вызвать

std::function<void(int)> foo; // <- функтор

foo = deleteAllItems; // <- создание коллбека

foo(); // <- вызов функции deleteAllItems(int);
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В другом классе я создаю указатель для этой функции.
void(InventoryContainer::*fnDelete)(unsigned int);
Но при попытке вызвать эту функцию,
this->fnDelete(this->IFrom);
студия показывает мне что this в данном случае не корректен.

1. Как правильно вызвать функцию?

Правильно показывает. fnDelete должен быть вызван для объекта класса InventoryContainer, и синтаксис разыменования указателя на функцию-член малость другой:

InventoryContainer *that;
...
(that->*fnDelete)(IFrom);


2. Где то на StackOverflow видел,что для вызова такой функции нужен ещё объект.Не лучше ли тогда просто передать ссылку на объект и через него и вызвать функцию?

Смысл указателя на функцию-член в том, что он даёт возможность вызывать любую функцию с такой сигнатурой в данном объекте. Т.е. для динамического выбора:
class A {
public:
  void f1();
  void f2();
};

void (A::*f)();
if (???)
  f = &A::f1;
else
  f = &A::f2;

...
A *pa;
...
(pa->*f)(); // вызывает f1 или f2
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@sitev_ru
sitev.ru - мой блог ...
sitev.ru/post/54 помогло?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы