enum-prototyp



  • Ich hab in einer Klasse "Aktion" einen enum-typ "AKT_ART" mit einigen Konstanten drin definiert. Also etwa

    class Aktion
    {
      public:
      ...
      enum AKT_ART{ NONE=-1, GO, RUN, ... };
      ...
    };
    

    Diese Klasse steht aber mit anderen Klassen in wechelseitiger Beziehung mit der Klasse "Person". d.h., ich binde in der Person.h die aKtion.h datei ein und umgekehrt. Weil aber zwangsweise eine Klasse definiert wird, ohne dass die andere definiert worden ist, muss ich Prototypen benutzen, also:

    class Aktion;
    
    #include "Person.h"
    
    class Aktion
    {
    ...
    };
    

    Das gleiche parallel in Person.h. Das funktioniert auch ganz gut, also die Personen-Klasse kann jetzt die Aktionen-Klasse benutzen und umgekehrt, aber seit ich den enum-Befehl in der Aktion-Klasse habe, geht's nicht mehr. Der Compiler bezeichnet Aktion::AKT_ART als undefiniert. Muss ich für die enum-Konstanten einen extra Prototyp einsetzen? Wie sieht der bei enum aus?



  • Es wäre deutlich einfacher zu antworten wenn du allen relevanten Quellcodes und am besten die Fehlermeldung gleich dazu postest.

    Scheint aber so dass du in Person irgendwo ein Aktion::AKT_ART Datenfeld hast; und der Compiler zu recht meckert, da er zu dem Zeitpunkt lediglich weiß das es eine Klasse Aktion geben soll, aber nicht weiß wie sie aussieht und schon gar nichts über irgendwelche enums die darin vorkommen.

    G, finix



  • Hallo

    definiere einfach für beide Klassen erreichbar das Enum als Typ :

    typedef enum { NONE=-1, GO, RUN, ... } T_AKT_ART;
    

    dann kannst du davon Variablen erstellen :

    T_AKT_ART AKT_ART;
    

    bis bald
    akari



  • akari schrieb:

    typedef enum { NONE=-1, GO, RUN, ... } T_AKT_ART;
    

    Und wo genau liegt der Unterschied zu

    enum T_AKT_ART { NONE=-1, GO, RUN, ... };
    

    ?



  • Walli schrieb:

    akari schrieb:

    typedef enum { NONE=-1, GO, RUN, ... } T_AKT_ART;
    

    Und wo genau liegt der Unterschied zu

    enum T_AKT_ART { NONE=-1, GO, RUN, ... };
    

    ?

    Die erste Version tut in C und C++ das gleiche die zweite nicht in C. In C++ sind jedoch beide identisch.



  • Hallo

    okay, dem Compiler ist es egal, ich übersehe eben oft, das enum und struct gleich Typen definieren.

    /Edit : Danke, Ben04. Da habe ich also die Schreibweise her.

    bis bald
    akari



  • Ben04 schrieb:

    In C++ sind jedoch beide identisch.

    Eben, deswegen sehe ich nicht ein warum man die umständlichere Syntax verwenden sollte.



  • Das wäre schon ne möglichkeit. Aber da ich ja noch lerne möcht ich schon gern wissen, wie es geht, wenn enum in der klasse ist. Ich poste mal alles wichtige:

    (Ich hab im Code "NPC" statt "Person", weil's im Forum leichter ist Person zu sagen.)

    // Aktion.h
    
    #ifndef AKTION_H
    #define AKTION_H
    
    class Aktion;
    
    // Kommentare und andere includes.
    #include "NPC.h"
    
    class Aktion
    {
        private:
    
            NPC *person;
    
            // weiteres.
    
        public:
    
            // weiteres.
    
            enum AKT_ART
            {
                NONE = -1,
                AKT_GEHEN,
                AKT_LAUFEN,
                AKT_SCHLENDERN
            };
    
            // mehr.
    
    };
    
    #endif
    
    //NPC.h
    
    #ifndef NPC_H
    #define NPC_H
    
    class NPC;
    
    // Kommentare und includes.
    #include "Aktion.h"
    
    class NPC
    {
    
       // irgendwas.
    
       // An dieser Stelle der Fehler "no type 'AKT_ART' in 'Aktion'"
       void neueAktion( ..., Aktion::AKT_ART nr, ... );
    };
    
    #endif
    

    Wenn Aktion.h compilliert wird, wird von Aktion der Prototyp bekannt gemacht und NPC.h eingebunden. Diese Datei bindet Aktion.h ein, aber die #ifndef's verhindern die mehrfachdeklaration. NPC kann aber den vorher aufgestellten Prototyp von Aktion verwenden. Aber enum AKT_ART ist für NPC noch imme runbekannt!



  • // Aktion.h
    
    #ifndef AKTION_H
    #define AKTION_H
    
    ////////////////
    /////class Aktion;
    
    // Kommentare und andere includes.
    ////////#include "NPC.h"
    
    class NPC; // <--------
    
    class Aktion
    {
        private:
    
            NPC *person;
    
            // weiteres.
    
        public:
    
            // weiteres.
    
            enum AKT_ART
            {
                NONE = -1,
                AKT_GEHEN,
                AKT_LAUFEN,
                AKT_SCHLENDERN
            };
    
            // mehr.
    
    };
    
    #endif
    
    // Aktion.cpp
    #include "NPC.h"
    ...
    


  • Ja das funktioniert. Aber das löst mein Problem nicht ganz, denn später wird es in der Klasse NPC ein ähnliches enum NPC_ART geben, dass dann in der Aktion-Klasse ebenfalls bekannt sein muss.

    Also die Klassen Aktion und NPC haben beide ihre eigenen enums, die der jeweils anderen Klasse bekannt sein müssen. Die Methode von finix dürfte für ein enum reichen, wie es jetzt ist. Aber was mache ich, wenn ich NPC auch sein enum gebe? Die jetzife Methode dürfte da nicht funktionieren 😕



  • Da hilft eigentlich nur noch akaris Vorschlag (in der C++-Variante:)) aufzugreifen.
    Oder besser noch ein Redesign - vielleicht einfach mal grob schildern was du überhaupt vorhast, ich bin mir fast sicher da kommen eine Menge Verbesserungsvorschläge zusammen 😉


Anmelden zum Antworten