gcc - 尝试实现观察者模式并得到分段错误(请帮助)c ++
问题描述
我正在尝试学习 c++,因此,我尝试从《游戏编程模式》一书中实现观察者模式,但我总是遇到分段错误。
搜索周围我看到当程序尝试访问未分配的内存时会发生分段错误。所以我努力修复它,但我做不到。有人可以帮助我吗?
这是我的代码:
观察者.h
#ifndef OBSERVER_H
#define OBSERVER_H
#include "EntityAndEvent.h"
#include "Subjects.h"
class Observer
{
private:
Observer* next_;
public:
Observer()
: next_(nullptr)
{}
virtual void onNotify(const Entity& entity, Event::Type event) = 0;
// Other stuff...
friend class Subjects;
};
#endif
成就.cpp
#ifndef ACHIEVEMENTS_CPP
#define ACHIEVEMENTS_CPP
#include "Observer.h"
#include <vector>
class Achievements : public Observer
{
public:
enum Type{
FELL_OFF,
AWAKE_ON
};
private:
std::vector<Type> done{};
public:
virtual void onNotify(const Entity&, Event::Type);
void unlock(Achievements::Type);
void printDone();
};
void Achievements::onNotify(const Entity& entity, const Event::Type event)
{
switch (event)
{
case Event::Type::ENTITY_FELL:
if(entity.isHero())
unlock(Achievements::Type::FELL_OFF);
break;
case Event::Type::ENTITY_AWAKE:
if(entity.isHero())
unlock(Achievements::Type::AWAKE_ON);
break;
default:
break;
}
};
void Achievements::unlock(Achievements::Type achiev)
{
done.push_back(achiev);
}
void Achievements::printDone()
{
// assert(done.size());
for(size_t i{0}; i < done.size(); i++)
{
std::cout << done[i] << "\n";
}
};
EntityAndEvent.cpp(我创建它只是为了与观察者和主题一起工作)
#ifndef ENTITY_AND_EVENT_H
#define ENTITY_AND_EVENT_H
class Entity
{
public:
inline const bool isHero() const {return true;}
};
class Event
{
public:
enum Type{
ENTITY_FELL,
ENTITY_AWAKE
};
};
#endif
主题.h
#ifndef SUBJECT_H
#define SUBJECT_H
#include "Observer.h"
#include <vector>
class Observer;
class Subjects
{
private:
// when implements this, prefer to use linked list or another optimized algorithms
Observer* head_{};
protected:
void notify(const Entity& Entity, Event::Type event);
public:
Subjects() : head_(NULL)
{};
~Subjects() {}
void addObserver(Observer* observer);
// const int getNumObs() const {return num_obs_;}
};
#endif
主题.cpp
#include "Subjects.h"
#include <cassert>
void Subjects::notify(const Entity& entity, Event::Type event)
{
Observer* observer = head_;
while (observer != NULL)
{
observer->onNotify(entity, event);
observer = observer->next_;
};
};
void Subjects::addObserver(Observer* observer)
{
if (head_ != nullptr)
observer->next_ = head_;
head_ = observer;
};
Physics.cpp(我创建它只是为了填充主题)
#ifndef PHYSICS_H
#define PHYSICS_H
#include "Subjects.h"
#include "EntityAndEvent.h"
class Physics: public Subjects
{
private:
public:
void update(const Entity& entity)
{
if (entity.isHero())
{
notify(entity, Event::Type::ENTITY_AWAKE);
};
};
};
#endif
主文件
#include "Observer.h"
#include "Achievements.h"
#include "Achievements.cpp"
#include "EntityAndEvent.h"
#include "Physics.h"
#include "Subjects.h"
#include "Subjects.cpp"
int main()
{
Physics *p{};
Entity e{};
Achievements *achiev{};
p->addObserver(achiev);
p->update(e);
return 0;
}
解决方案
随着Physics *p{};
您声明一个指针,但它当前不指向有效对象(它正在被初始化为nullptr
here)。因此,调用 p->addObserver 会导致分段错误。您应该能够通过在调试器中运行程序来确认这一点。
你为什么在这里使用指针?更改Physics *p{};
为Physics p{};
。
免责声明:由于您的代码绝对不是最小示例,因此我没有查看整个代码,甚至没有尝试编译它。我只是发布一个答案,因为main
函数中存在明显错误(使用无效指针)导致分段错误。
推荐阅读
- reactjs - 如何防止反应组件通过 apollo usequery 重新渲染?
- python - 定义 RB 树的搜索
- php - 传递数据时在循环中创建多个模态
- javascript - 插入满足条件的数组元素
- javascript - jQuery 选择器或“如果”麻烦
- excel - 如何为文本字符串使用 Select Case
- functional-programming - 具有多个构造函数和属性的 F# DbContext 继承
- c++ - 使用 aarch64-linux-gnu-g++ 编译 Qt C++ 代码后对“pthread”的未定义引用
- python - 将线程进度发布回 tkinter 框架
- javascript - 从另一个组件更新一个组件的状态