Anfängerproblem



  • Hi,
    ich will eine Liste global stellen - in einer Datei "GlobaleVariablen.h"

    Dafür steht in GlobaleVariablen.h:

    extern list<Sprite*> Sprites;
    extern list<Sprite*>::iterator it;
    

    und in der GlobaleVariablen.cpp:

    list<Sprite*> Sprites;
    list<Sprite*>::iterator it;
    

    ich erhalte aber leider irgendwelche Fehler, dass Sprite nicht deklariert ist - wird aber eingebunden per #include "Sprite.h" in die GlobaleVariablen.h

    Hat jemand eine Idee, woran das liegen könnte?

    mfg



  • Ein globaler Container ist ja schon genug schlimm, aber ein globaler Iterator? Brauchst du den "wirklich" global (muss er über längere Zeit auf das Gleiche zeigen)? Wobei man grundsätzlich selten globale Variablen verwenden sollte. Auch der Zeiger im Container gefällt mir nicht besonders. Oft wird der nämlich eingesetzt, obwohl es genauso gut mit Instanzen ginge.

    Ist Sprite in einem Namensraum? Hast du den Sprite -Header auch in der .cpp-Datei eingebunden? Zeige sonst ein wenig Code...


  • Mod

    Erklär am Besten auch einmal, was du vorhast. Wie Nexus schon sagte, sind globale Container und erst recht globale Iteratoren eher ungewöhnlich. Da du dich selber als Anfänger bezeichnest, ist das wahrscheinlich schlechtes Design und man kann dir hier eine bessere Herangehensweise für dein Problem vorschlagen.



  • Hi,
    also allgemein dreht es sich um ein 2D Spiel in DirectX.

    Ich habe eine Schuss Klasse, wo Sprites für Laserschüsse etc. erstellt werden, die werden zur Kollision in einer Liste gespeichert (Die, um die es hier geht).

    Dann werden noch Raumbasen erstellt, und damit ich die Kollision zwischen Laser und Raumbasis feststellen kann, muss die Liste für beide Klassen zugänglich sein.

    Normalerweise erstell ich nichts global, aber das scheint hier die beste Lösung zu sein



  • Anfänger999 schrieb:

    Normalerweise erstell ich nichts global, aber das scheint hier die beste Lösung zu sein

    Nein. Ist es fast nie. 😉

    Nichts ist einfach so "da". In deinem Fall ist eine Art Managerklasse wahrscheinlich besser geeignet. Also eine Klasse, die Schüsse verwaltet und auf Kollisionen prüft. Diese kann dann auch entsprechende Memberfunktionen bereitstellen, zum Beispiel:

    bool IstGetroffen(const Raumbasis& Basis);
    

    Natürlich ist eine Klasse, die globale Variablen nur wrappt, nicht besser als globale Variablen selber. Besonders, wenn deren Instanzen selber wiederum global sind. Aber mit der Zeit bringt man diese Dinge in eine gewisse Beziehung zueinander, sodass alles seinen bestimmten Zweck hat und auch nur dort bekannt ist, wo nötig. Die Managerklasse ist dann beispielsweise wieder Bestandteil einer anderen Klasse mit höherem Abstraktionslevel. Auf diese Weise bleiben die Abhängigkeiten immer schön klein, was die Zuständigkeiten klar regelt, Fehler auf wenige Orte einschränkt und nebenbei noch die Kompilierzeit erhöht.

    Das ist vielleicht nicht ganz einfach nachvollziehbar, aber mit zunehmender Erfahrung kommt man diesem Prinzip näher. Ich sage auch nicht, dass die von mir vorgeschlagene Managerklasse die ideale Herangehensweise ist, fast immer gibt es verschiedene Lösungen. Aber es ist immerhin schon ein rechter Schritt von der globalen Variable weg - allein schon durch die Kapselung, die dabei entsteht und unbefugten Zugriff einschränkt.


Anmelden zum Antworten