Avatar billede mollevp Nybegynder
17. marts 2006 - 15:34 Der er 1 kommentar og
1 løsning

Segmentation fault

Hej, jeg ville lige prøve at implementere observer pattern i C++, men noget funker ikke helt. Jeg får en segmentation fault når programmet terminere..

#include <iostream>
#include <list>

using namespace std;

//Forward declaration
class Subject;

class Observer
{
public:
  virtual ~Observer();
  virtual void Update(Subject* aSubject) = 0;
};

Observer::~Observer()
{
  cout << "destructor i observer" << endl;
}

class Subject
{
public:
  virtual ~Subject();
  void Attach(Observer*);
  void Detach(Observer*);
  void Notify();
protected:
  Subject();
private:
  list<Observer*> *iObservers; //Creates a list of observer pointers
};

Subject::~Subject()
{
  cout << "destructor i subject" << endl;
  delete iObservers;
  iObservers = NULL;
}
Subject::Subject()
{
  iObservers = new list<Observer*>;
}
void Subject::Attach(Observer* aObserver)
{
  iObservers->push_back(aObserver);
}
void Subject::Detach(Observer* aObserver)
{
  iObservers->remove(aObserver);
}
void Subject::Notify()
{
  for(list<Observer*>::iterator it = iObservers->begin(); it != iObservers->end(); ++it)
    {
      Observer* obs = *it;
      obs->Update(this);
    }
}
 

class ClockTimer : public Subject
{
public:
  void HelloMoto(){ Notify(); }
};

class TheClock : public Observer
{
public:
  TheClock(ClockTimer* aTimer);
  ~TheClock();
  void Update(Subject* aSubject);

private:
  ClockTimer* iTimer;

};

TheClock::TheClock(ClockTimer* aTimer)
{
  aTimer->Attach(this);
}

TheClock::~TheClock()
{
  iTimer->Detach(this);
}

void TheClock::Update(Subject* aSubject)
{
  cout << "Der fik jeg en update" << endl;
}


int main()
{
  ClockTimer subject;
  TheClock observer(&subject);

  subject.HelloMoto();

  cout << "program terminated" << endl;

  return 0;

}

Giver følgende:

$ Der fik jeg en update
$ program terminated
$ Segmentation fault (core dumped)

Kan I se problemet?
Avatar billede mollevp Nybegynder
17. marts 2006 - 15:36 #1
Jeg håber ikke det er for uoverskueligt.. Har eksperten en måde at paste kode så det kommer syntax highligt på??
Avatar billede mollevp Nybegynder
17. marts 2006 - 15:45 #2
Ahh fandt lige problemet, have glemt at sætte iTimer variablen..

/// UPDATE ///
TheClock::TheClock(ClockTimer* aTimer)
{
  iTimer = aTimer;
  aTimer->Attach(this);
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester