Problem: Zugriff auf member funktion durch funktion in anderem Header



  • Hi Leute,

    ich arbeite gerade an einen Schiffe versenken(Console). Und ich versuche den Rat vom Pumukl so gut wie möglich einzuhalten und alles möglichst modular zu halten.
    Also hier mein problem:

    Ich habe in meiner Header-Datei eine Klasse definiert:

    "class.h"

    #include "function.h"
    class Test{
    public:
      //memberfunction
      void func();
    private:
      //members  
    };
    

    jetzt habe ich einen Funktion die so ähnlich ausschaut:
    "function.h"

    // Setting ships
    // amount i={1,2,3,4}
    
    void vSetShips(int iShip , CMap *game){ 
      for (int i = 1 ; i < 5; i++){
         // for i = 1 and initial iShip = 5
         // for(int j = 0 ; j < 1;j++)
         for (int j = 0 ; j < 6-iShip; j++){
             game->ship(iShip);
             game->showMap();
             }
         // Length of iShip decreased    
         iShip--;
         }
    }
    

    Wenn ich compile kommt eine Fehlermeldung "CMap" not declared. Ich habe function.h doch in class.h eingefügt, warum erkennt der den nicht an?
    Oder habe ich irgendwas mit dem Pointer falsch gemacht?



  • DaNewGuy_unlogged schrieb:

    Ich habe function.h doch in class.h eingefügt, warum erkennt der den nicht an?
    Oder habe ich irgendwas mit dem Pointer falsch gemacht?

    Ähmm...
    1. Wo hast du CMap definiert?
    2. Wo greifst du überhaupt auf die Klasse zu? (Ich meine wegen deines Titels).

    Die Codestellen die du uns zeigst haben jedenfalls rein gar nichts miteinander zu tun.



  • Zu 1.CMap wurde in "class CMap{... };" definiert, hier als class Test{..}; bezeichnet.

    zu 2. in "class.h" inkludiere ich "function.h"
    und in function.h, greife ich per pointer auf die funktionen aus der classe zu. Die Klasse heißt CMap [game->ship(iShip) und game->showMap();] das sind die funktionen aus der Klasse CMap aus "class.h"



  • DaNewGuy schrieb:

    Zu 1.CMap wurde in "class CMap{... };" definiert, hier als class Test{..}; bezeichnet.

    Das ist zu spät. CMap wird vor seiner Definition verwendet, also muss der Typ bekannt sein. Erstelle dazu eine Deklaration vor der ersten Verwendung:

    class CMap;
    

    Unter Umständen musst du die Definition der Funktion, die CMap verwendet, in eine separate .cpp-Datei auslagern, da der Typ vollständig bekannt sein muss.

    Und trenne dich bitte von "C"-Klassenpräfixen, Gründe erfährst du hier.



  • Sorry, aber in welche datei soll ich das schreiben?
    Um ehrlich zu sein finde ich das mit den vielen Headern zur Zeit noch recht konfus:D.
    Kann ich nicht "class.h" einfach in "function.h" einfügen?
    Und das mit mit dem großen "C" vor Klassen mache ich weil es den hungarian-standard von Windows programmierern entsprechen soll;-). Was für eine Notation verwendest du? Wenn die besser ist dann mache ich das auch so:D.

    EDIT: Ich schreib die funktion jetzt einfach in die main.cpp, da hat sie einwandfrei funktioniert. Gibts da vielleicht eine option in der IDE eine Funktion in eine Header-File auszulagern? Das wäre cool und würde mir in Zukunft eine menge kopfschmerzen ersparen:D.



  • Du kannst ein Programm auch aus mehreren CPP-Dateien zusammenstellen. Und ansonsten hast du das #include vermutlich genau verkehrt herum angesetzt - die "class.h" benötigt keinen Zugriff auf die "function.h", eher andersherum.

    PS: Die ungarische Notation in dieser Form ist eher umstritten, afaik sogar im Umfeld von Microsoft.



  • DaNewGuy schrieb:

    Und das mit mit dem großen "C" vor Klassen mache ich weil es den hungarian-standard von Windows programmierern entsprechen soll;-)

    Die MFC verwendete diese Präfixe ursprünglich als eine Art Namensraum. Einige Programmierer haben das aber falsch verstanden und sind auf die Idee gekommen, selbst vor jede Klasse ein "C" zu schreiben.

    DaNewGuy schrieb:

    Was für eine Notation verwendest du? Wenn die besser ist dann mache ich das auch so:D

    Ich verwende keine typabhängigen Präfixe, weil für mich deren Nachteile überwiegen (siehe Link). Mein Stil sieht folgendermassen aus, ich würde mir jedoch nicht anmassen, ihn als "der beste" zu bezeichnen. Aber ein Schritt weg von den Präfixen ist immer gut 🙂

    class MeineKlasse
    {
        public:
            void MemberFunktion();
    
        private:
            double mMemberVariable;
    };
    
    float GlobaleFunktion()
    {
        float lokaleVariable;
        return 3.f * lokaleVariable;
    }
    
    typedef MeineKlasse IrgendeinTyp;
    


  • DaNewGuy schrieb:

    Zu 1.CMap wurde in "class CMap{... };" definiert, hier als class Test{..}; bezeichnet.

    Bitte achte in Zukunft darauf zumindest den Code soweit anzupassen, das wir dies auch nachvollziehen können.


Anmelden zum Antworten