[C++] - Unbehandelte Ausnahme...

Rofi

Erfahrenes Mitglied
Hallo,

bin C++ anhand einer DVD von Monika Hödl (video2brain) am lernen. Ich
benutze Microsoft Visual C++.net.

Bei dem fehlerhaften Programmm wird das Dos-Fenster noch kurz geöffnet, dann kommt besagte Fehlermeldung
"Unbehandelte Ausnahme..." Bei der Ausführung in Einzelschritten fand ich
heraus, dass der Fehler sich ab Zeile 52 bemerkbar macht.
Kann mir jemand sagen, was falsch ist?

#include <iostream>
#include <string>

using namespace std;

class Tier{

public:

Tier();

//Tier-Kopierkonstruktor

Tier (const Tier &);

//virtuelle Clone-Methode

virtual Tier * Clone() const {

cout << "Aufruf der Clone-Methode des Tieres" << endl;

return new Tier(*this);

}

};

class Hund : public Tier{

public:

string getName() const{ return *name; }

void setName(string n){ *name = n; }

string* name;


Hund();

//Hund-Kopierkonstruktor

Hund (const Hund &);

//virtuelle Clone-Methode von Hund, die diejenige von Tier überschreibt

Hund * Clone() const {

cout << "Aufruf der Clone-Methode des Hundes" << endl;

return new Hund(*this);

}

};

Tier::Tier(){}

Tier::Tier(const Tier &altes_tier){

cout << "Aufruf des Kopierkonstruktors des Tieres" << endl;

}

Hund::Hund(){

setName("kein Name vorhanden");

}

Hund::Hund(const Hund &alter_hund){

cout << "Aufruf des Kopierkonstruktors des Hundes" << endl;

name = new string;

setName(alter_hund.getName());

}

int main(){

cout << "Hasso soll geklont werden" << endl;

Tier *hasso = new Hund;

Tier *fifi = hasso->Clone();

delete hasso;

delete fifi;

cin.get();

return 0;

}



//Danke
 
Hi.

Das Problem ist, das du versuchst in der setName Methode einen nicht-initialisierten Zeiger zu verwenden.


Warum benutzt du denn überhaupt Zeiger? Lass das mal am besten weg. Und normalerweise sollte man Membervariablen immer vor Zugriff von aussen schützen so das diese nur durch die get/set Methoden zugreifbar sind.

Code:
class Hund {
private:
  string name;

public:
  string getName() const { return name; }
  void setName (const string& n) { name = n; }
};

Falls du dennoch die Zeiger verwenden möchtest, dann solltest du im Standardkonstruktor Speicher für den String "name" allozieren. Außerdem brauchst du dann eigentlich auch einen virtuellen Destruktor um den Speicher ordentlich wieder freizugeben.

Code:
class Hund {
  string* name;
public:
  Hund () : name (0) {
    name = new string ();
  }

  // Destruktor
  virtual ~Hund () {
    delete name;
  }
};

Und verwende doch bitte das nächste mal die Code-Tags.

Gruß
 
Zurück