Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstruktor verhindert Stringzuweisung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.08.2005, 12:28 Uhr
DanielJ



Hallo alle zusammen,

mein Problem ist folgendes:

Habe einen Konstruktur, Copy-Konstruktor, Destruktor und nen neuen assignment-operator geschrieben.
Zuweisung des Strings Vorname = "Hans"; funkt in folgender Methode nicht mehr.
Die Funktion strcpy(Vorname,"Hans"); klappt allerdings.

C++:
void Adressbuch::creatperson()
{    
    
    Vorname = new char[5];
    Vorname = "Hans";
    
    //strcpy(Vorname,"Hans");
}


Am Ende des Programmes bekommen ich eine Fehlermeldung:
Debug Assertion Failed!

Im folgenden sind Konstruktor und Co...vielleicht kann mir erklären was ich nicht weiß.


C++:
Adressbuch::Adressbuch()
{
    Vorname = "no entry";
    //Nachname = NULL;
    //Anschrift = NULL;
}

Adressbuch::Adressbuch(Adressbuch &Objekt)
{
  
   Vorname = new char[strlen(Objekt.Vorname) + 1];
   strcpy(Vorname, Objekt.Vorname);
}

Adressbuch &Adressbuch::operator=(Adressbuch &Objekt)
{
   delete [] Vorname;
   Vorname = new char[strlen(Objekt.Vorname) + 1];
   strcpy(Vorname, Objekt.Vorname);
   return *this;
}


Adressbuch::~Adressbuch(void)
{
    delete [] Vorname;
    //delete [] Nachname;
    //delete [] Anschrift;
}




Bearbeitung von virtual:
BITTE CODE TAGS VERWENDEN!

Dieser Post wurde am 23.08.2005 um 13:55 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.08.2005, 13:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Die Deklaration von Adressbuch hast Du jetzt leider fortgelassen, aber ich nehme mal an, Vorname ist eine char*?

Mach ein std::string draus und entferne alle new/delete Dinger. Ein std::string macht das alles für dich. Dann kannst Du auch im op= schrieben
Vorname = Objekt.Vorname; und braucht nicht so dolle anstrengenden Code zu schreiben.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.08.2005, 13:23 Uhr
DanielJ



Hallo virtual,
vielen Dank für deine Hilfe, leider bin ich mit namespace usw. noch nicht wirklich firm und mir lässt es keine Ruhe warum es so nicht läuft. Wenn ich debugge, gibt er die Fehlermeldung erst beim return 0; ab, also ganz zum Schluss.
Ich denke es ist irgendein Speicherproblem (Memory-Leak???), vielleicht wird dieser ja nicht richtig freigegeben.
Mein Konstruktor und/oder Destruktor sind vermutlich Schuld. Über die Standard-Funktionen klappt es ja.
Ach so, Vorname ist ein char*.

MfG Daniel Just
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.08.2005, 13:55 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du weist in deinem default-ctor einen konstanten wert dem pointer zu, und versuchst ihn dann im destruktor zu löschen -> access violation
--
class God : public ChuckNorris { };

Dieser Post wurde am 23.08.2005 um 13:55 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.08.2005, 14:13 Uhr
DanielJ



Jawoll, das klingt fast logisch...aber müsste die

strcpy(Vorname, "Hans");

nicht auch access violation ausgeben?
da ja das zweite Argument als const char* übergeben wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.08.2005, 14:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nein da der konstante String "Hans" in den dynamisch angelegten speicher kopiert wird, d.h dein Pointer zeigt danach immer noch auf die gleiche stelle, nur der inhalt ist eben geändert, dagegen bei = "Hans" der Pointer eben auf den konstanten string zeigt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.08.2005, 14:30 Uhr
Spacelord
Hoffnungsloser Fall


Ne strcpy kopiert ja den Inhalt ("Hans") in den von dir belegten Speicherplatz,auf den du natürlich auch zugreifen darfst.
Wenn du nur vorname= "Hans" schreibst weisst du deinem char* die Speicheradresse eines konstanten Stringliterals zu. "Hans" wird vom Compiler schon zur Übersetzungszeit in nen Speicherbereich gepackt auf den du keinen Zugriff hast.

EDIT: Das passiert wenn man mal eben pinkeln geht

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 23.08.2005 um 14:31 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.08.2005, 14:43 Uhr
DanielJ



Vielen Danke Leute,
soeben hat sich der Knoten gelöst, zwar spät aber er tat es,
war wie immer ein gutes Gefühl.
Am Ende klingt doch alles irgendwie logisch...


MfG DanielJ
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: