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
Schreibt mein Story nicht mit einem r?
MfG Stazer
Hallo Ombalat,
deine zweite Variante (mit Stack) kann nicht funktionieren, da du einen Pointer auf dieses Sprite zurückgibst, der mit dem Funktionsende ungültig wird - weil ja das Sprite am Ende der Funktion gelöscht wird.
Daher kommt die Zugriffsverletzung.
Du hast das Sprite ja selbst mit "Temporäres Sprite" kommentiert. Dann soll es ja auch nur temporär - also innerhalb der Funktion - zur Verfügung stehen. Danach kannst du nicht mehr drauf zugreifen.
Also entweder du gibst keinen Zeiger, sondern das Objekt selbst zurück oder aber du legst das Sprite auf dem Heap an - dann aber nach Möglichkeit nicht in der Funktion selbst sondern im Konstruktor von CGame und rufst hier nur die Funktion Load() auf.
Gruß
SaRu_
C-/C++-Quelltext |
|
1 2 3 |
Funktionsaufruf: *pSpriteIntro_Text = LoadStorry(ID_Storry); //Storry Datei laden |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Funktion: //Funktion zum Laden der Storry CSprite CGame::LoadStorry(const int &ID_Storry) { CSprite TempSprite; //Temporäres CSprite für den Text if(ID_Storry == 1) TempSprite.Load("Data/Emphasis/Storry/Storry_1.Emphasis"); else if(ID_Storry == 2) TempSprite.Load("Data/Emphasis/Storry/Storry_2.Emphasis"); return TempSprite; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Überladener Operator in Sprite (unverändert): CSprite& CSprite::operator =(CSprite& rhs) { if(m_pImage != NULL) { SDL_FreeSurface(m_pImage); //m_pImage = new SDL_Surface; } Load(rhs.GetPath()); return *this; } |
C-/C++-Quelltext |
|
1 2 |
CSprite *pSpriteIntro_Text = new CSprite; *pSpriteIntro_Text = LoadStorry(ID_Storry); |
C-/C++-Quelltext |
|
1 2 3 4 |
CSprite *pSpriteIntro_Text = new CSprite; pSpriteIntro_Text = LoadStorry(ID_Storry); // Wobei dann LoadStorry() wieder einen Zeiger zurückgeben müsste - das hatten wir ja schon... //... // pSpriteIntro_Text steht auch übers Funktionsende hinaus noch zur Verfügung - muss aber, sobald nicht mehr benötigt, mit delete freigegeben werden |
C-/C++-Quelltext |
|
1 2 3 4 |
CSprite SpriteIntro_Text; // Kein Zeiger! SpriteIntro_Text = LoadStorry(ID_Storry); //... // Ende der Funktion -> SpriteIntro_Text wird automatisch freigegeben - steht also nicht mehr zur Verfügung |
Schreibt mein Story nicht mit einem r?
MfG Stazer
Zitat von »Stazer«
Schreibt mein Story nicht mit einem r?
MfG Stazer
Guck mal weiter oben!
Mfg Harry222
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
Funktionsaufruf: CSprite SpriteIntro_Text; SpriteIntro_Text = LoadStory(ID_Story); //Storry Datei laden //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis"); SpriteIntro_Text.SetColourKey(205,179,139); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Ladefunktion: CSprite CGame::LoadStory(const int ID_Story) { CSprite TempSprite; //Temporäres CSprite für den Text if(ID_Story == 1) TempSprite.Load("Data/Emphasis/Storry/Storry_1.Emphasis"); else if(ID_Story == 2) TempSprite.Load("Data/Emphasis/Storry/Storry_2.Emphasis"); return TempSprite; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
Operator: CSprite& CSprite::operator =(CSprite& rhs) { if(m_pImage != NULL) SDL_FreeSurface(m_pImage); Load(rhs.GetPath()); return *this; } |
Zitat von »Stazer«
Schreibt mein Story nicht mit einem r?
MfG Stazer
Guck mal weiter oben!
Mfg Harry222
Hab ich ihm auch schon gesagt
Das hatten wir schon weiter oben im Thread .Und der Zuweisungsoperator sollte eine const-referenz nehmen.
Werbeanzeige