Присвоение функций-членов свойству члена-экземпляра - PullRequest
5 голосов
/ 20 мая 2019

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

После некоторого изучения я понимаю метод! = Function, поскольку метод экземпляра неявно ожидает экземпляр самого себя (лучший способ, которым я могу описатьэто!) и что std::bind был вариант, но я не могу заставить это работать, когда подпись не <void(void)>.

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

Вот базовая версия того, чего я пытаюсь достичь:

class ChildClass
{
public:
    std::function<int(int)> callback;
};

class MainClass
{
public:
    ChildClass childClass;

    MainClass()
    {
        this->childClass.callback = this->square;
    }

private:
    int square(int i)
    {
        return i * i;
    }
};

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

1 Ответ

4 голосов
/ 20 мая 2019

Вы можете использовать лямбда (с захватом this).

MainClass()
{
    this->childClass.callback = [this](int i) { return this->square(i); };
}

LIVE

Или если вы хотите придерживатьсяstd::bind:

MainClass()
{
    using namespace std::placeholders;
    this->childClass.callback = std::bind(&MainClass::square, this, _1);
}

LIVE

И см. Bind Vs Lambda? и Когдая должен использовать std :: bind?

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