Я создаю приложение 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();
}
Поскольку я абсолютный новичок в использовании сигналов, я не совсем уверен, использую ли я их, поскольку они предназначены для использования.
Почему бы вам не поставить сигнал внутри класса человека?
Вы могли бы сделать что-то вроде этого:
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();
}
Других решений пока нет …