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 |
#pragma once #include <SFML\Graphics.hpp> class collectedSprite { public: collectedSprite(int layer); ~collectedSprite(); sf::Sprite* mSprite; /* ... */ private: static std::multimap<int, sf::Sprite*> allSprites; int layer; /* ... */ }; |
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 |
#include "collectedSprite.h" collectedSprite::collectedSprite(int layer) : layer(layer) { sf::Sprite* newSprite = new sf::Sprite; allSprites.insert(std::pair<int, sf::Sprite*>(layer, newSprite)); mSprite = newSprite; } collectedSprite::~collectedSprite() { for (auto it = allSprites.find(layer); it != allSprites.end(); it++) { if (it->second == mSprite) { allSprites.erase(it); break; } } delete mSprite; mSprite = nullptr; } /* ... */ |
Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von »sw1« (08.01.2016, 21:41) aus folgendem Grund: Unbeabsichtigt abgeschickt und Fehlerkorrekturen.
C-/C++-Quelltext |
|
1 |
for (auto it = allSprites.find(layer); it != allSprites.end(); it++) |
Zitat von »http://www.cplusplus.com/reference/map/multimap/find/«
Notice that this function returns an iterator to a single element (of the possibly multiple elements with equivalent keys). To obtain the entire range of equivalent elements, see multimap::equal_range.
C-/C++-Quelltext |
|
1 |
sf::Sprite* newSprite = new sf::Sprite; |
Um deine Frage zu Beantworten, du must deine Static Variable Initialiseren..
ausser zu raten
Zitat
Normal sollte allSprites.find durch allSprites.begin() ersetzt werden, bin mir hier nicht Sicher ob mit find das erste Elment im Kontainer auf anhieb gefunden wird.
Zitat
unnötig die Sprites auf dem Heap zu erzeugen der Stack reicht da völlig. Und wenn Heap dann sollten Smartpointer benutzt werden.
Zitat
Das ganze ließe sich sicher auch anders lösen, habe nur noch nicht ganz verstanden was du genau vorhast.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
void collectedSprite::drawAllSprites(sf::RenderWindow& fenster) { for (auto it = allSprites.begin(); it != allSprites.end(); it++) { fenster.draw(*it->second); } } |
Zitat
Eine statische Membervariable muss nicht initialisiert werden. Sie mussen aber definiert werden. Ueber fehlende Definitionen kann sich aber nur der Linker beschwerden. Hier tritt der Fehler aber angeblich beim kompilieren auf. Von daher kann man auf die Frage eigentlich keine sinnvolle Antwort geben, ausser zu raten.
Mein Vorschlag daher: Der OP sollte die Basics von C++ lernen sowie mit seiner IDE umzugehen, damit er beim naechsten Mal sein Problem vernuenftig schildern kann.
Zitat
Und ob der Linker oder der Compilier den Fehler ausgibt, wird unter umständen dem TE nicht bewust sein.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »sw1« (09.01.2016, 14:15) aus folgendem Grund: Fehlerkorrektur
Ich habe mir den Link von oben mal angesehen. Warum genau muss die statische Membervariable nun initialisiert (bzw. definiert?) werden? wenn ich das static entferne läuft ja auch alles durch und ich erhalte zunächst einfach einen leeren Container.
Wie genau kann ich die static std::multimap<int , sf :: Sprite*> nun initialisieren bzw. definieren?
C-/C++-Quelltext |
|
1 2 |
// in der cpp Datei std::multimap<int, sf::Sprite*> collectedSprite::allSprites; |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (09.01.2016, 16:14)
Ja und warum verschweigst du uns dann die Fehlermeldungen? Oder meintest du echt "Datei nicht gefunden" wuerden schon reichen?Genau weiß ich nicht ob es beim kompilieren oder beim Linker das Problem gibt, hatte mich im ersten Beitrag da falsch ausgedrückt. Mir wird noch folgende Fehlermeldung ausgegeben:
1>collectedSprite.obj : error LNK2001: Nicht aufgel÷stes externes Symbol ""private: static class std::multimap<int,class sf :: Sprite *,struct std::less<int>,class std::allocator<struct std::pair<int const ,class sf :: Sprite *> > > collectedSprite::allSprites" (?allSprites@collectedSprite@@0V?$multimap@HPAVSprite@sf@@U?$less@H@std@@V?$allocator@U?$pair@$$CBHPAVSprite@sf@@@std@@@4@@std@@A)".
1>textButton.obj : error LNK2001: Nicht aufgel÷stes externes Symbol ""public: virtual void __thiscall textButton::activityCheck(class sf::RenderWindow &)" (?activityCheck@textButton@@UAEXAAVRenderWindow@sf@@@Z)".
1>C:\Users\Walther\Documents\Visual Studio 2015\Projects\Gravitation\Debug\Gravitation.exe : fatal error LNK1120: 2 nicht aufgel÷ste Externe
Zitat
Ja und warum verschweigst du uns dann die Fehlermeldungen? Oder meintest du echt "Datei nicht gefunden" wuerden schon reichen?
Zitat
Desweiteren halte ich dein Design fuer ein voelliges Fehldesign! Warum nicht eine Klasse Layer mit einem Vektor/Liste von Sprites und dann wieder eine Klasse LayerContainer mit einem vector/map der Layer? Was wuerde wohl passieren, wenn du mal deine Layermap paralell brauchst, z.b. in einem Spiel mit Splitscreen oder wo man einfach zwischen 2 Modis umschalten (z.B. Uebersichtskarte und Kampfbildsschirm)? Dann musst du alles schoen umschreiben weil es ja nur eine globale Liste gibt mit deiner statischen Map.
Werbeanzeige