Указатели метода прохождения и приведения
Я борюсь за создание производных классов и передачу указателей на методы из него в базовый класс, чтобы функция, объявленная в базовом классе, могла вызывать его (вызывать функцию производного класса через интерфейс).
Цель состоит в том, чтобы создать производные классы, чтобы принести свои собственные ресурсы и функции, но вызов функции, объявленной там, должен быть возможен путем вызова одного из них в функции, которую предоставляет базовый класс. Для этого мне нужно передать указатель на функцию-член производного вниз в базовый класс.
Вот что я попробовал:
class KeyFunction
{
void(*KeyFunction::KeyFuncPtr)() = nullptr; //pointer to a method of this class to store standard behavior for call
public:
KeyFunction(void(*KeyFunction::KeyFunc)()) : KeyFuncPtr(KeyFunc) {} //constructor which takes in standard behavior
void func() //standard call of the function
{
if(KeyFuncPtr)KeyFuncPtr(); //call with ensurance there's something to be called
}
void operator()() //make KeyFunction class callable
{
func();
}
};
class customRessource{
public:
string up = "UP";
string down = "DOWN";
};
class customKeyFunc : public KeyFunction
{
customRessource& r;
public:
void moveup() //possible behavior
{
cout << r.up;
}
void movedown()
{
cout << r.down;
}
customKeyFunc( void(*customKeyFunc::KeyFunc)() ) :KeyFunction( ( void(*KeyFunction::)() ) (KeyFunc) ){}
};
int main()
{
customKeyFunc Up(&(customKeyFunc::moveup)); //setup functions
customKeyFunc Down(&customKeyFunc::movedown);
Up(); //call functions
Down();
getchar();
return 0;
}
Основная функция в конце показывает предполагаемый способ использования класса.
Прежде всего: мои типы в конструкторах каждого класса становятся дикими (я много пробовал найти правильную запись указателей на члены, но я все еще не стабилен с синтаксисом) Может кто-нибудь помочь мне понять их правильно?
Могу ли я даже сделать это (особенно приведение указателей на члены, как я делал в конструкторе customKeyFunc)? Я правильно прихожу к этому или считаю слишком сложным?
Заранее спасибо за вашу помощь!
1 ответ
Что -то вроде этого?
#include <functional>
#include <string>
#include <iostream>
class customResource{
public:
const std::string up = "UP";
const std::string down = "DOWN";
};
class customKeyFunc
{
const customResource& r;
public:
customKeyFunc(const customResource& r) : r(r) {}
void moveup() //possible behavior
{
std::cout << r.up;
}
void movedown()
{
std::cout << r.down;
}
};
int main()
{
customResource r;
customKeyFunc f(r);
auto Up = std::function<void()>(std::bind(&customKeyFunc::moveup, f));
auto Down = std::function<void()>(std::bind(&customKeyFunc::movedown, f));
Up(); //call functions
Down();
return 0;
}
std::function<void()>
является полиморфным функтором, который будет копировать любой объект, который:
является подвижным или копируемым, и
инвентарь
void operator()