Это правильный и подходящий способ использовать сигналы повышения?

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

Несколько человек порекомендовали указатели на функции, но теперь я узнал, что если вы передаете указатель на функцию-член, вы также должны передать указатель на объект (почему бы просто не передать указатель на объект только для вызова методов?)

В любом случае, мне также порекомендовали использовать boost::signal2. Я реализовал очень простой рабочий пример. Я в основном привязываю сигнал к функции объекта GUI. Затем передайте указатель на сигнал объекту, который может вызвать сигнал. Смотрите код ниже...

struct GUI
{
    void talk()
    {
        cout << "hello" << endl;
    }
};

class Person {
public:
    Person(){}
    Person(const signal<void ()>* sig) : sig(sig){}
    virtual ~Person(){}

    void testSig()
    {
       (*sig)();
    }


private:
    const signal<void ()>* sig;
};

int main() {
    boost::signals2::signal<void ()> sig;
    GUI gui;
    sig.boost::signals2::connect(boost::bind(&GUI::talk, &gui));

    Person tom(&sig);
    tom.testSig();
}

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

1 ответ

Почему бы вам не поставить сигнал внутри класса человека? Вы могли бы сделать что-то вроде этого:

struct GUI
{
    void talk() {
        cout << "hello" << endl;
    }
};

class Person {
    boost::signals2::signal<void ()> sig_;
public:
    Person() {}
    virtual ~Person() {}

    template <typename F>
    void connect(F f) {
        sig_.connect(f);
    }

    void testSig() {
       sig_();
    }
};

int main()
{
    GUI gui;
    Person tom;

    tom.connect(boost::bind(&GUI::talk, &gui));
    tom.testSig();
}
Другие вопросы по тегам