【发布时间】:2018-06-14 19:22:18
【问题描述】:
所以我遇到了这个问题,我一直在为我的 OOP 考试练习,我尝试构建一个观察者设计模式。 不幸的是,似乎每次我初始化一个接口时,它都会以某种方式复制我的控制器,这意味着观察者列表的新副本。因此,我的界面没有更新。
我的观察者:
#pragma once
#include <vector>
#include <algorithm>
class Observer
{
public:
virtual void update() = 0;
virtual ~Observer() {}
};
class Observable
{
private:
std::vector<Observer*> observers;
public:
virtual ~Observable() {}
void addObserver(Observer *obs)
{
observers.push_back(obs);
}
void removeObserver(Observer *obs)
{
observers.erase(std::remove(observers.begin(), observers.end(), obs));
}
void notify()
{
for (auto obs : observers)
{
obs->update();
}
}
};
这是需要更新的界面:
class Practice : public QWidget, public Observer
{
Q_OBJECT
public:
Practice(Controller& ctrl, Teacher& t, QWidget *parent = Q_NULLPTR);
--------------
Practice::Practice(Controller& ctrl, Teacher& t, QWidget *parent) : ctrl{ ctrl }, t{ t }, QWidget(parent)
{
ui.setupUi(this);
QObject::connect(ui.studentList, &QListWidget::itemSelectionChanged, this, [this]() {this->listItemChanged(); });
QObject::connect(ui.gradeButton, &QPushButton::clicked, this, &Practice::on_gradeButton_clicked);
this->populateStudentsList();
this->ctrl.addObserver(this);
}
我的主要:(我打开多少“老师”的窗户)
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Repository repo("Student.txt", "Teacher.txt");
Controller ctrl(repo);
std::vector<Teacher> temp = ctrl.getRepo().getTeachers();
for (int i = 0; i < temp.size(); ++i)
{
Practice* p = new Practice{ctrl, temp[i]};
p->setWindowTitle(QString::fromStdString(temp[i].getName()));
p->show();
}
return a.exec();
}
另外,我的控制器继承自 Observable。
我对其进行了调试,得出的结论是,每次初始化“练习”时都会创建一个新控制器,但我不知道为什么。
谢谢。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ observer-pattern