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

Я создаю приложение 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();
}

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

0

Решение

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

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();
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector