Указатели метода прохождения и приведения

Я борюсь за создание производных классов и передачу указателей на методы из него в базовый класс, чтобы функция, объявленная в базовом классе, могла вызывать его (вызывать функцию производного класса через интерфейс).

Цель состоит в том, чтобы создать производные классы, чтобы принести свои собственные ресурсы и функции, но вызов функции, объявленной там, должен быть возможен путем вызова одного из них в функции, которую предоставляет базовый класс. Для этого мне нужно передать указатель на функцию-член производного вниз в базовый класс.

Вот что я попробовал:

    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()

Другие вопросы по тегам