Forwärtsdeklaration bei Klassen



  • Ich hab ein Problem bei meinen Hausaufgaben und komme nicht wirklich weiter.

    Erstellt werden sollen die Klassen Auto und Reifen.

    Hier die Reifen.h:

    #ifndef REIFEN_H
    #define REIFEN_H
    #include <iostream>
    using namespace std;
    
    class Reifen
    {
    public:
        Reifen();
    
       string marke;
    
       void setMarke(const string &value);
    };
    
    #endif // REIFEN_H
    
    

    und die Reifen.cpp:

    #include "reifen.h"
    
    Reifen::Reifen()
    {
     marke = "tmp";
    }
    
    void Reifen::setMarke(const string &value)
    {
        marke = value;
    }
    

    Die Klasse Auto soll ein Array von 4 Reifen haben. Wir sollen mit Vorwärtsdeklarationen arbeiten.

    Auto.h

    #ifndef AUTO_H
    #define AUTO_H
    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Reifen;      // Vorwärtsdeklaration, damit ich ein Array von Reifen erstellen kann
    
    class Auto
    {
    public:
        Auto();
    
        void carData();
        void setReifen(int i, string marke);
    
    private:
    
     string modell;
     int alter;
     Reifen *reifen[4];
    };
    
    #endif // AUTO_H
    

    Und die Auto.cpp:

    #include "auto.h"
    
    Auto::Auto()
    {
      modell = "Modell";
      alter = 5;
    }
    
    void Auto::carData() {
        cout << modell << " " << alter << " " << endl;
    }
    
    void Auto::setReifen(int i, string marke) {
       // reifen[i].setMarke(marke);          -->  setMarke wird nicht erkannt
    }
    

    Mein Problem ist, dass in der Auto cpp die Methode setMarke nicht erkannt wird.

    Hab ich die Vorwärtsdeklaration falsch gemacht oder muss man noch etwas zusätzlich machen?



  • @Freya
    Grundsätzlich: wenn du eine Frage zu Fehlermeldungen des Compilers hast, füge hier eine Kopie ein. „Wird nicht erkannt“ ist keine Fehlermeldung.

    Du benutzt ein Array von Zeigern. Zeiger haben keine Funktion setMarke.



  • Dank für die schnelle antwort : )

    Ich hatte zuerst das Array so deklariert:

    Reifen reifen[4];
    

    Da kam aber direkt die Fehlermeldung "field has incomplete Type 'reifen' " wo ich auch nicht weitergekommen bin.



  • @Freya sagte in Forwärtsdeklaration bei Klassen:

    Da kam aber direkt die Fehlermeldung "field has incomplete Type 'reifen' " wo ich auch nicht weitergekommen bin.

    Ja, wenn du hier nur Vorwärtsdeklarationen verwenden darfst, kennt der Compiler die Größe von Reifen nicht. Du musst also tatsächlich Zeiger verwenden. Das sollte doch aber irgendwie im Unterricht besprochen worden sein.



  • @Freya, du musst Reifen in deine Auto-CPP-Datei inkludieren.



  • @manni66 Wir haben das Thema noch nicht so richtig angesrochen...



  • @eigenartig Ich dachte man benutzt Vorwärtsdeklarationen damit man keinen #include machen muss



  • Ja, in den Headerdateien (damit man dort nicht unnötig andere Headerdateien einbinden muß), aber in den Source-Dateien muß selbstverständlich die komplette Klassendefinition bekannt sein.

    Wenn du (besitzende) Zeiger verwendest, dann mußt du aber auch selber für die Speicherverwaltung sorgen (oder einen Smartpointer stattdessen verwenden).

    Trotzdem solltest du hier einfach Reifen reifen[4]; verwenden und dann eben "Reifen.h" einbinden.
    Es macht m.E. hier keinen Sinn so auf "Vorwärtsdeklarationen" zu bestehen (auch wenn man grundsätzlich dies bei der C++ Programmierung wissen sollte).



  • @Th69 Super!
    Danke für die Antwort : )


Log in to reply