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

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

1

06.04.2022, 22:06

SFML Game Development Pointer einer Map

Hallo Leute,

ich habe vor kurzem angefangen das Buch SFML Game Development durchzuarbeiten und bin dabei auf Seite 39 (falls jemand nachschauen möchte) auf folgende Klasse gestoßen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace Textures
{
    enum ID
    {
        Landscape, Airplane, Missile
    };
}


class ResourceHolder
{
    private:
        std::map<Textures::ID, std::unique_ptr <sf::Texture>> mTextureMap;

    public:
        void load (Textures::ID id, const std::string& filename);

        sf::Texture& get (Textures::ID id);
};

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ResourceHolder::load (Textures::ID id, const std::string& filename)
{
    std::unique_ptr <sf::Texture> texture (new sf::Texture ());
    texture->loadFromFile (filename);

    mTextureMap.insert (std::make_pair (id, std::move (texture)));
}


sf::Texture& ResourceHolder::get (Textures::ID id)
{
    auto found = mTextureMap.find (id);
    return *found->second;
}


Jetzt meine kurze Frage. Warum muss ich bei der get Funktion im return das '*' angeben und was wäre wenn ich es nicht angeben würde?
cout << "Programmieren muss sein" << endl;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

07.04.2022, 10:43

"found->second" ist vom Typ std::unique_ptr<...>. Den kannst Du also nicht zurückgeben, wenn die Funktion behauptet, ein Texture& zurückzugeben. Deswegen dereferenziert das return den UniquePtr. Ohne zu gucken, ob der Eintrag überhaupt gefunden wurde... Tss... Naja, jede, wie sie mag.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Inatrox

Frischling

  • »Inatrox« ist der Autor dieses Themas

Beiträge: 61

Wohnort: Dresden

  • Private Nachricht senden

3

07.04.2022, 11:47

Das Prüfen von Fehlern wird im nächsten Kapitel behandelt, also keine Sorgen das kommt auch noch :D
cout << "Programmieren muss sein" << endl;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

07.04.2022, 12:34

War nur ein Spruch. Man kann ja verschieden an Fehlerbehandlung gehen. Und wenn ich ein Spiel habe, in dem alle Texturen als Enum hinterlegt sind, dann ist die Abfrage einer Textur, die's nicht in der Map gibt, ja ein Programmiererfehler und kein Laufzeitfehler. Den kann man dann auch so behandeln, z.B. mit nem schlichten assert(found != mTextureMap.end());
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige