Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat
Eine Ausnahme (erste Chance) bei 0x01363a2d in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004.
Unbehandelte Ausnahme bei 0x01363a2d in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000004.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#ifndef EVENTMANAGER_HPP #define EVENTMANAGER_HPP #include <list> #include <SFML/Window.hpp> #include "EventObserverInterface.hpp" class EventManager { private: std::list<EventObserverInterface*> observerList; public: EventManager(); ~EventManager(); void attachObserver(EventObserverInterface& observer); void dettachObserver(EventObserverInterface& observer); void notify(sf::Event& event); }; #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include "EventManager.hpp" EventManager::EventManager() { } EventManager::~EventManager() { } void EventManager::attachObserver(EventObserverInterface& observer) { observerList.push_back(&observer); //Fehler! } void EventManager::dettachObserver(EventObserverInterface& observer) { observerList.remove(&observer); } void EventManager::notify(sf::Event& event) { std::list<EventObserverInterface*>::iterator it(observerList.begin()); for(;it != observerList.end(); ++it) { (*it)->GetEvent(event); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef EVENTOBSERVERINTERFACE_HPP #define EVENTOBSERVERINTERFACE_HPP #include <SFML/Window.hpp> class EventObserverInterface { public: virtual void GetEvent(const sf::Event& event) = 0; }; #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef INTROEVENTOBSERVER_HPP #define INTROEVENTOBSERVER_HPP #include "EventObserverInterface.hpp" class IntroEventObserver: public EventObserverInterface { public: void GetEvent(const sf::Event& event); }; #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
IntroState::IntroState() { Application::GetInstance().GetImageManager().Load("img/logo.png"); logo.SetImage(Application::GetInstance().GetImageManager()["img/logo.png"]); Application::GetInstance().GetEventManager().attachObserver(eventObserver); //Verursacht den Fehler } |
Community-Fossil
C-/C++-Quelltext |
|
1 |
Application::GetInstance().GetEventManager().attachObserver(eventObserver); |
Zitat von »"drakon"«
Den virtuellen Destruktor von EventObserverInterface nicht vergessen!
Und der Fehler hat nichts mit der Liste zu tun, sondern du hast wahrscheinlich kein gültiges Objekt. Hier:
C-/C++-Quelltext
1 Application::GetInstance().GetEventManager().attachObserver(eventObserver);
GetEventManager gibt dir wahrscheinlich 0 zurück.
So etwas siehst du aber sehr gut mit einem Debugger.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#ifndef APPLICATION_HPP #define APPLICATION_HPP #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include "GameStateManager.hpp" #include "ImageManager.hpp" #include "SoundManager.hpp" #include "EventManager.hpp" class Application { private: sf::RenderWindow screen; sftools::ImageManager imgm; sftools::SoundManager sfxm; GameStateManager gsm; EventManager evtm; public: static Application& GetInstance() { static Application app; return app; } sftools::ImageManager& GetImageManager(); sftools::SoundManager& GetSoundManager(); sf::RenderWindow& GetWindow(); GameStateManager& GetGameStateManager(); EventManager& GetEventManager(); void input(); void logic(); void render(); protected: Application(); Application(const Application& copy) {}; }; #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include "Application.hpp" Application::Application() { screen.Create(sf::VideoMode(800, 600),"TestTitle"); } sftools::ImageManager& Application::GetImageManager() { return imgm; } sftools::SoundManager& Application::GetSoundManager() { return sfxm; } sf::RenderWindow& Application::GetWindow() { return screen; } GameStateManager& Application::GetGameStateManager() { return gsm; } EventManager& Application::GetEventManager() { return evtm; } void Application::input() { sf::Event event; while(GetWindow().GetEvent(event)) { if(event.Type == sf::Event::Closed) GetWindow().Close(); GetEventManager().notify(event); } GetGameStateManager().GetGameState()->input(); } void Application::logic() { GetGameStateManager().GetGameState()->logic(); } void Application::render() { GetGameStateManager().GetGameState()->render(); GetWindow().Display(); } |
Zitat
0x00000004
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#ifndef INTROSTATE_HPP #define INTROSTATE_HPP #include <SFML/Graphics.hpp> #include "GameStateInterface.hpp" #include "IntroEventObserver.hpp" class IntroState: public GameStateInterface { private: IntroEventObserver eventObserver; sf::Sprite logo; sf::String copyright; public: IntroState(); ~IntroState(); void input(); void logic(); void render(); }; #endif |
Werbeanzeige