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
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
// Cspaceship.cpp #include <iostream> #include "Cspaceship.hpp" using namespace std; Cspaceship::Cspaceship() { cout << "Konstruktor1 wird aufgerufen und Standartwerte werden initialisiert!" << endl; m_energy=0; m_velocity=0; this->SetName("prototyp"); } Cspaceship::Cspaceship(char *name,const int energy,const int velocity) { cout << "Konstruktor2 (mit Parameterliste) wird aufgerufen und Werte uebergeben!" << endl; m_energy=energy; m_velocity=velocity; m_name = name; } void Cspaceship::ShowData() { cout << endl; cout << "Shuttle \t : " << (m_name) << endl; cout << "Energy \t\t : " << m_energy << endl; cout << "Velocity \t : " << m_velocity << endl; cout << endl; } void Cspaceship::SetName() { char chartemp[256]; cout << "Namen eintragen: "; cin >> (chartemp); m_name=(&chartemp[0]); //m_name=chartemp; //strcpy(m_name,chartemp); cout << "m_name innerhalb von Cspaceship::SetName() \n direkt nach der Zuweisung: " << (m_name) << endl; cout << "m_name innerhalb von Cspaceship::SetName() \n mittels ::GetName() direkt nach der Zuweisung: " << (this->GetName()) << endl; } void Cspaceship::SetName(char *name) { cout << (name) << endl; m_name=name; //cout << (m_name) << endl; } char *Cspaceship::GetName() { return (m_name); } //++++++++++++++++++++++++++++++++++ // Cspaceship.hpp //++++++++++++++++++++++++++++++++++ class Cspaceship { private: int m_energy; int m_velocity; protected: char *m_name; public: Cspaceship(); Cspaceship(char *name, int energy, int velocity); virtual void ShowData(); void SetName(); void SetName(char *name); char *GetName(); } //++++++++++++++++++++++++++++++++++ // mainprog.cpp //++++++++++++++++++++++++++++++++++ #include <iostream> #include "Cspaceship.hpp" #include "CMinenleger.hpp" using namespace std; int main() { const int iNshuttles=1; Cspaceship *pshuttleList = NULL; pshuttleList = new Cspaceship[iNshuttles]; for (int i=0;i<iNshuttles;i++) { pshuttleList[i].SetName(); cout << endl; cout << "m_name innerhalb von main() nach der Zuweisung: " << pshuttleList[i].GetName() << endl; //cout << (pshuttleList[i].GetName()) << endl; pshuttleList[i].SetName("hurleburle"); pshuttleList[i].ShowData(); } delete[] pshuttleList; pshuttleList=NULL; } |
[/cpp]Zitat
Aber das wird dein Problem nicht beheben (k vielleicht stürzt das Programm nicht mehr ab). Der Fehler muss woanders legen, poste mal bitte nochmal den gesamten Code. Besonders der der Ausgabe.
Alter Hase
C-/C++-Quelltext |
|
1 2 |
m_name = new char[ strlen(chartemp) + 1 ]; strcpy( m_name, chartemp ); |
Zitat von »"Steven77"«
Wenn Du strcpy verwendest, musst Du noch Speicher für m_name reservieren. Vielleicht in der Art so (Funktion "SetName" ohne Parameter):
C-/C++-Quelltext
1 2 m_name = new char[ strlen(chartemp) + 1 ]; strcpy( m_name, chartemp );
In der Variante mit Parametern (sowie im Konstruktor mit Parametern) solltest Du auch besser eigenen Speicher für m_name reservieren und dann die Daten per strcpy kopieren. Theoretisch ist das nicht unbedingt notwendig, wenn konstante Strings, also "hard-gecodete" Strings, übergeben werden, weil die permanent im Speicher stehen und es zu keiner Speicherverletzung kommt (glaube ich :angel: ). Allerdings müsstest Du dann irgendein Flag setzen, was Auskunft darüber gibt, ob Speicher für m_name explizit reserviert wurde (was zu raten ist), oder nicht, da Du diesen ja auch wieder "deleten" müsstest.
Die std::string-Geschichte ist aber eigentlich sehr einfach, obwohl ich persönlich das auch immer am liebsten mit char* etc. mache.
C-/C++-Quelltext |
|
1 |
delete[] m_name;
|
Zitat von »"koschka"«
denk aber daran: du alloziierst Speicher, diesen musst du wieder freigeben. das macht man in deinem Fall mit delete[] m_name;
C-/C++-Quelltext |
|
1 2 3 4 5 |
if (m_name!=NULL) { delete[] m_name; m_name=NULL; } |
Zitat von »"koschka"«
ja das ist eben ein Problem. Wenn du die Klasse benutzt (ohne die Set Name Methode), wird kein Speicher alloziiert. Was soll er dann freigeben? stz den Zeiger einfach auf NULL (im Konstructor). und prüf im Destructor ob er immernoch NULL ist, wenn nicht, löschen!
Quellcode |
|
1 2 3 4 |
CTolleKlasse::CTolleKlasse() { m_name =NULL; } |
Zitat von »"koschka"«
hast du auch im Konstrukto m_name auf NULL gesetzt?
Quellcode
1 2 3 4 CTolleKlasse::CTolleKlasse() { m_name =NULL; }
Werbeanzeige