2017-03-06 1 views
0

Beispiel:SDL - Mit einem std :: vector mit SDL_Texture funktioniert nicht, Array funktioniert

class DefaultTexture 
{ 
public: 
    bool loadFromFile(std::string path); 
    void render(int x, int y); 
protected: 
SDL_Texture* mTexture; 
}; 

main:(...) 
DefaultTexture mCards[2]; 
DefaultTexture X; 
X.loadFromFile("Data/basic_card.png"); 
DefaultTexture Y; 
Y.loadFromFile("Data/basic_card.png"); 
mCards[0] = X; 
mCards[1] = Y; 
mCards[0].render();mCards[1].render(); 

Das funktioniert gut (ich beide Bilder sehen kann) Wenn ich std :: vector stattdessen kann ich nur siehe den ersten.

std::vector<DefaultTexture> mGG; 
DefaultTexture X; 
X.loadFromFile("Data/basic_card.png"); 
DefaultTexture Y; 
Y.loadFromFile("Data/basic_card.png"); 
mGG.push_back(X); mGG.push_back(Y); 
mGG[0].render(); mGG[1].render(); 

Kann jemand mir erklären, warum arbeiten seine nicht? (Egal ob ich 2 oder 100 verwende, kann ich nur die erste sehen)

+0

Ist es ein Tippfehler, dass einer Ihrer Anrufe Pars zu machen hat, und der andere nicht? (mGG [0] .render; mGG [1] .render();) – JGroven

+0

Ja, ich habe nur vergessen, es hier aufzuschreiben. – AutobahnPolizei

+0

Mit einem Debugger können Sie überprüfen, ob die Daten korrekt in den Vektor geschoben werden? Es könnte sich um einen fehlerhaften Kopierkonstruktor handeln. Ist dies auch der eigentliche Code? Wie es aussieht, könnte der Fehler etwas anderes sein. – ZeroUltimax

Antwort

0

Die erste verwendet = operator. Der zweite verwendet Kopierkonstruktor.

Eine mögliche Lösung ist die Kopie zu vermeiden. Sie könnten Zeiger verwenden :)

#include <memory> 

//... 

std::vector<std::shared_ptr<DefaultTexture>> mGG; 

std::shared_ptr<DefaultTexture> X(new DefaultTexture); 
std::shared_ptr<DefaultTexture> Y(new DefaultTexture); 
X->loadFromFile("Data/basic_card.png"); 
Y->loadFromFile("Data/basic_card.png"); 

mGG.push_back(X); 
mGG.push_back(Y); 

shared_ptr reference

+0

Danke! Das funktioniert. (Noch auf eine Lösung ohne Zeiger hoffen) – AutobahnPolizei

+0

@AutobahnPolizei Sehen Sie sich die ** Regel von drei ** in diesem Fall. Für Ihre' DefaultTexture "-Klasse Sie müssen einen Destruktor, einen Kopierkonstruktor und einen Kopierzuweisungskonstruktor bereitstellen. –

Verwandte Themen