Du bist nicht angemeldet.

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

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

11

12.03.2014, 22:34

Ich meine in der Zeile hier muss man aufpassen. ;)

C-/C++-Quelltext

1
std::unique_ptr<sf::Texture>& tex = textureMap.at(filename);
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

12

13.03.2014, 00:31

Ups, natürlich. Da sollte er .find() anstelle von .at() verwenden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (13.03.2014, 00:39)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

13.03.2014, 06:31

Was aber praktisch irrelevant ist, da er selbst eine Exception wirft, wenn das File nicht auf der Platte liegt.
Also ob da jetzt eine Exception fliegt, weil der Name in der Map unbekannt ist oder weil das File nicht existiert, es ist eine Ausnahme. Er könnte zwar find benutzen, würde dann aber auch nur eine Exception werfen. Sicher könnte die mehr Details beinhalten, es läuft aber auf's selbe hinaus - es fliegt eine Exception - so oder so.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

14

13.03.2014, 08:22

Naja BC, es ist schon ein Unterschied, ob die Exception fliegt, weil der Eintrag noch nicht in der Map existiert, oder weil die Datei nicht existiert.
Aktuell würde, falls die Aussagen von Legend und Nacho stimmen, jedes Mal eine Exception fliegen, wenn ich mir eine Textur abholen will. Schließlich existieren mit dem neuen Ctor ja überhaupt keine Einträge in der Map.

Von daher wurde daraus jetzt: std::unique_ptr<sf::Texture> tex = std::move( (resourceMap.find(filename))->second );
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

15

13.03.2014, 09:55

Genau, wenn der Eintrag nicht in der Map vorhanden ist, fliegt er raus auch wenn die Textur auf der Platte vorhanden wäre.
Ich schlage da aber was in dieser Art vor:

C-/C++-Quelltext

1
2
3
4
5
6
auto searchiter = resourceMap.find(filename));
if (searchiter == resourceMap.end ()) {
   /* Eintrag ist NICHT vorhanden, einmal wohlkontrolliert hinzufügen. */
} else {
   /* Eintrag ist da, kann also direkt per searchiter->second benutzt werden */
}


Da fällt mir grad auf, wenn du std::move benutzt, dürfte der unique_ptr aus der map keinen Eintrag mehr haben.
D.h. beim nächsten Mal wird die Textur doch neu geladen?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

16

13.03.2014, 10:33

Aua, da hast du natürlich Recht. Mangelnde Erfahrung mit Smartpointern, C++ Abstinenz und Coding direkt nach dem Aufwachen vertragen sich wohl nicht so gut. Ändere ich, sobald ich nach Hause komme. Danke für den Hinweis.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

17

13.03.2014, 20:14

Sooo, der Compiler schmeißt keine Fehler, ich lasse euch natürlich trotzdem noch drüberschauen, bzw. poste hier den aktuellen (fertigen?) Code für alle, die eventuell mal selbst einen RM implementieren wollen :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const sf::Texture& ResourceManager::getTexture(const std::string& filename) {
    auto texIt = resourceMap.find(filename);

    // No texture with the given filename was found, load it and move the pointer into the map
    if (texIt == resourceMap.end()) {
        std::unique_ptr<sf::Texture> tex(new sf::Texture);
        if (!(tex->loadFromFile(resourcePath + filename))) {
            throw ("The file \"" + filename + "\" can not be found at " + resourcePath + "!");
        }
        resourceMap.insert(std::make_pair(filename, std::move(tex)));
        return *tex;
    }
    // Texture is in the map already, return it
    else {
        return *(texIt->second.get());
    }
}
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

18

14.03.2014, 10:16

"für alle die selbst einen RM implementieren wollen" -> macht es bloß nicht so.
Die std::map ist wohl die schlechteste Wahl hier. Dann noch std::string als Key für die Map.
Sorry, aber das geht gar nicht.
Hätte aber auch mal einer der alten Hasen hier erwähnen können.

Obwohl es hier ja "nur" um die Frage nach Referenz oder nicht geht.
Aber mal einen Hinweis geben wäre schon nett gewesen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

14.03.2014, 10:34

Wieso machst du keinen Vorschlag wenn du es besser weißt?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

14.03.2014, 11:23

Hätte aber auch mal einer der alten Hasen hier erwähnen können.
Wieso sollten wir Unfug erzählen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige