C ++ - Ошибка при попытке push_back указателя функции на вектор, расположенный в другом CPP файле - PullRequest
0 голосов
/ 25 февраля 2020

Введение

Я новичок в C ++, имейте это в виду, пытаясь объяснить свою проблему.

Я делаю игру на C ++, чтобы помочь мне лучше понять язык и пока я делал этот проект, я решил, что мне нужны события (например, C# события), чтобы помочь мне с этим проектом, и после некоторых исследований я обнаружил, что C ++ не имеет системы обработчика событий, подобной C# один, поэтому я попытался сделать что-то, что работало так же, как обработчик событий C#.

В файле Main. cpp я создал это:

typedef void(*KeyPressedFunction)(sf::Keyboard::Key);
std::vector<KeyPressedFunction> keyPressedEvent;
int main()
{
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                window.close();
                break;
            case sf::Event::KeyPressed:
                for (KeyPressedFunction func : keyPressedEvent)
                {
                    func(event.key.code);
                }
                break;
            }
        }
    }
}

Идея состоит в том, что каждый класс, который хотел знать, когда была нажата клавиша, собирался подписаться на событие (push_back на вектор keyPressedEvent), и когда клавиша нажимается, каждая система будет иметь эту информацию.

Проблема

После того, как я проверил систему в основном файле. cpp (создание функции и возврат к вектору keyPressedEvent), я заметил, что она работает нормально, тестовые функции, которые я создал был c все правильно, поэтому я решил реализовать в остальной части системы, что означает ... в других единицах перевода.

Вот что я сделал:

  • Pacman .h Файл:

    typedef void(*KeyPressedFunction)(sf::Keyboard::Key);
    extern std::vector<KeyPressedFunction> keyPressedEvent;
    
    class Pacman
    {
    public:
        Pacman(float x, float y);
        void OnKeyPressed(sf::Keyboard::Key key);
    };
    
  • Pacman. cpp Файл:

    #include "Pacman.h"
    #include <iostream>
    
    void Pacman::OnKeyPressed(sf::Keyboard::Key key)
    {
    
    }
    
    Pacman::Pacman(float x, float y)
    {
        keyPressedEvent.push_back(*OnKeyPressed);
    }
    

Линия, которая вызывает все проблемы, keyPressedEvent.push_back(*OnKeyPressed); этот, хотя я делаю то же самое, что и при тестировании «системы событий» раньше.

Ошибка: «Операнд '*' должен быть указатель "

Я думаю, что эта ошибка каким-то образом связана с вектором, находящимся в другой единице перевода, но я не знаю, как ее решить.

1 Ответ

1 голос
/ 27 февраля 2020

Проблема в том, что Pacman::OnKeyPressed - это метод (функция-член * non-stati c), а не обычная функция. (Кстати, это не имеет ничего общего с единицами перевода). Если бы эта функция была stati c, ваш код был бы в порядке.

Решение состоит в том, чтобы использовать std::function вместо указателей функций и std::bind, чтобы сделать его из функции-члена (см. Также Использование объектов generi c std :: function с функциями-членами в одном классе ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...