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
Alter Hase
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 108 109 110 111 |
// Cspaceship.cpp #include <iostream> #include "Cspaceship.hpp" using namespace std; Cspaceship::Cspaceship() { m_energy=0; m_velocity=0; this->SetName("prototyp"); } Cspaceship::Cspaceship(char *name,const int energy,const int velocity) { m_name=new char; m_energy=energy; m_velocity=velocity; m_name = name; } Cspaceship::~Cspaceship() { if (m_name!=NULL) { delete[] m_name; m_name=NULL; } } 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]; m_name=new char[strlen(chartemp)+1]; cout << "Namen eintragen: "; cin >> (chartemp); strcpy(m_name,chartemp); } 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; } |
Zitat von »"Phil_GDM"«
Zeig deinen derzeitigen Code doch nochmal her.
Vermutlich veränderst du irgendwo den Wert des Char-Zeigers und nicht seinen Inhalt.
Alter Hase
Zitat von »"mann73"«
hallo phil,
also hier nochmal der code
C-/C++-Quelltext
1 2 3 4 5 6 void Cspaceship::SetName(char *name) { cout << (name) << endl; m_name=name; //cout << (m_name) << endl; }
C-/C++-Quelltext |
|
1 2 3 4 |
void Cspaceship::SetName(char** name) { m_name = *name; } |
C-/C++-Quelltext |
|
1 2 3 4 |
void Cspaceship::SetName(char* name) { strcpy(m_name, name); } |
Alter Hase
Quellcode |
|
1 |
void Cspaceship::SetName(char *name) |
:huhu:Zitat von »"Phil_GDM"«
Hier noch eine etwas genauere Erklärung des Problems (hab grad Zeit ):
Wenn du einer Funktion einen int übergibst, dann kann dieser innerhalb dieser Funktion verändert werden usw. . Wird die Funktion verlassen, hat der Übergabeparamter wieder seinen alten Wert, da in der Funktion nur mit einer Kopie davon gearbeitet wurde.
Willst du den Inhalt des int's ändern, übergibst du der Funktion einen Zeiger auf den Int. Vom Zeiger selbst wird widerum eine Kopie angefertigt. Doch diese Kopie zeigt immer noch auf den int. Dadurch kannst du den Wert des ints mittels dieser Zeigerkopie verändern.
Mit m_name = name hast du m_name den Wert von der Kopie des Zeigers auf den String gegeben. Nach dem Verlassen der Funktion existiert die Kopie des Zeigers aber nicht mehr => m_name = NIRVANA .
Deshalb musst du der Funktion einen Zeiger auf den Zeiger übergeben. Denn damit gibst du durch m_name = *m_name der Variable m_name den "wirklichen" Wert des Zeigers und nicht den seiner Kopie.
Ich hoffe dass das verständlich ist.
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
// Cspaceship.cpp #include <iostream> using namespace std; class Cspaceship { private: int m_energy; int m_velocity; protected: char *m_name; public: Cspaceship(); Cspaceship(char *name, int energy, int velocity); ~Cspaceship(); //Destructor vergessen virtual void ShowData(); void SetName(); void SetName(char *name); char *GetName(); }; // ; vergessen zu koperen ;) Cspaceship::Cspaceship() { m_energy=0; m_velocity=0; // m_name auf NULL setzen vergessen! m_name = NULL; this->SetName("prototyp"); } Cspaceship::Cspaceship(char *name,const int energy,const int velocity) { // Speciher allozieren, da wir hier den Konstructor haben kann m_name // vorher nicht verwendet wurden sein! m_name = new char [strlen(name) + 1]; m_energy=energy; m_velocity=velocity; } Cspaceship::~Cspaceship() { if (m_name!=NULL) { delete[] m_name; m_name=NULL; } } 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]; // Hier das gleiche, wenn du 2 mal den Namen veränderst, forderst du immer neuen Speicher an, // das ist falsch den der aslte muss erst freigegeben werden, deshalb: // Speicher löschen if(m_name != NULL) delete[] m_name; // Erst den neuen Namen abfragen, damit dui dessen Länge auch ermittel kannst ;) cout << "Namen eintragen: "; cin >> (chartemp); m_name=new char[strlen(chartemp)+1]; // Daten nun kopieren strcpy(m_name, chartemp); } // Diese Methode funktionierte nicht... void Cspaceship::SetName(char *name) { // Es ist klar das das nicht geht.... da evtl auch hier kein Speicher definiert wurde. // Deiser wird ja nur bei Set oder dem zweiten Konstuctor angefordert. // Deswegen: // Speicher löschen if(m_name != NULL) delete[] m_name; // Speicher alloziieren m_name = new char [strlen(name) + 1]; // Daten kopieren -> fertsch ;) strcpy(m_name, name); } char *Cspaceship::GetName() { return (m_name); } int main() { const int iNshuttles=3; Cspaceship *pshuttleList; pshuttleList = new Cspaceship[iNshuttles]; pshuttleList[0].SetName("hello"); 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; // Auf NULL setzen ist hier zewcklos, da das Programm eh terminiert wird. return 0; // nicht vergessen ;) } |
Alter Hase
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
Cspaceship::Cspaceship(char *name,const int energy,const int velocity) { // Speciher allozieren, da wir hier den Konstructor haben kann m_name // vorher nicht verwendet wurden sein! m_name = new char [strlen(name) + 1]; m_energy=energy; m_velocity=velocity; } |
Werbeanzeige