'referat' does not name a type



  • Hi,
    Ich verzweifle gerade an einem Fehler, der beim compilen meines aktuellen Projekter auftritt. Folgende Situation: Ich habe ein wxWidgets Projekt ( aber wxWidgets unabhängiges Problem ) und eine andere Klasse die die wxMain-Klasse includet und umgekehrt.

    referat.h

    #ifndef REFERAT_H
    #define REFERAT_H
    
    #define SLIDES 12
    #define SLIDEWIDTH 960
    #define SLIDEHEIGHT 720
    
    #include "facharbeitMain.h"
    
    class referat
    {
        public:
            referat( facharbeitFrame *containing );
            virtual ~referat();
            void setPicture();
            wchar_t* getImgString();
    
        private:
            facharbeitFrame *container;
            int curImg;
            wxString path;
    
    };
    
    #endif //REFERAT_H
    

    facharbeitMain.cpp

    #ifndef FACHARBEITMAIN_H
    #define FACHARBEITMAIN_H
    
    //(*Headers(facharbeitFrame)
    #include <wx/listctrl.h>
    #include <wx/notebook.h>
    #include <wx/sizer.h>
    #include <wx/menu.h>
    #include <wx/textctrl.h>
    #include <wx/panel.h>
    #include <wx/statbmp.h>
    #include <wx/button.h>
    #include <wx/frame.h>
    #include <wx/statusbr.h>
    //*)
    
    #include "referat.h"
    
    class facharbeitFrame: public wxFrame
    {
        public:
    
            facharbeitFrame(wxWindow* parent,wxWindowID id = -1);
            virtual ~facharbeitFrame();
    
            void ownInit();
            void resize();
            wxStaticBitmap* returnLPBM1();
    
            wxChar** argv;
    
            referat p3; // <------- Fehler
            ...
    #endif // FACHARBEITMAIN_H
    

    In dem Main-File des Projekts wird die referat.h eingebunden, aber trotzdem bekomme ich in der angegebenen Zeile diesen Fehler:

    39|error: 'referat' does not name a type|
    

    Hoffe ihr könnt mir helfen und dass ich grad nur auf dem Schlauch stehe 🙂

    MfG RikuXan



  • Wenn die Datei, die Du da zeigst wirklich facharbeitMain.cpp ist, warum hat sie dann einen include guard? Such mal für Deinen Compiler, ob es da einen Schalter für die Ausgabe des Preprozessors gibt und guck Dir den output mal an. Wahrscheinlich hast Du da sich gegenseitig eingebundene header. Ersetze mal die Zeile

    #include "facharbeitMain.h" in referat.h

    durch

    class facharbeitFrame;

    mfg Torsten



  • Wenn ich

    #include "facharbeitMain.h" in referat.h
    

    durch

    class facharbeitFrame;
    

    ersetze bekomme ich zwei Arten von Fehlern:

    6|error: invalid use of incomplete type 'struct facharbeitFrame'|
    8|error: forward declaration of 'struct facharbeitFrame'|
    

    Der include guard wird von wxWidgets beim erstellen eines Projekts automatisch erstellt.
    Und ja die Header sind gegenseitig eingebunden, aber ich dachte das wäre mit dem include guard kein Problem.
    Wenn doch, wie soll ich die Situation dann lösen ( referat braucht Zugriff auf facharbeitFrame und referat muss aus facharbeitFrame heraus instanziert werden. )

    MfG RikuXan



  • RikuXan schrieb:

    Und ja die Header sind gegenseitig eingebunden, aber ich dachte das wäre mit dem include guard kein Problem.

    Der Include guard verhindert nur das doppelte Einbinden.

    Wenn doch, wie soll ich die Situation dann lösen ( referat braucht Zugriff auf facharbeitFrame und referat muss aus facharbeitFrame heraus instanziert werden. )

    Dort, wo Du mit einem "incomplete type" auskommst, solltest Du den Typen nur deklarieren und nur dort, wo Du den kompletten Typen brauchst, den Header einbinden. Also da, wo Du im header nur einen Zeiger oder eine Referenz benötigst, den Typen deklarieren und da wo Du jetzt die Fehlermeldungen hast, den Header einbinden. Das ist übrigends "guter Stil", da es besonders in größeren Projekten, die Übersetzungszeiten stark verringern kann.

    mfg Torsten



  • Ich habe deine Antwort jetzt so umgesetzt, dass ich im cpp-file der referat-Klasse die facharbeitMain.h includiere.
    Funktioniert auch soweit, vielen Dank für die nette Hilfe 🙂

    MfG RikuXan


Anmelden zum Antworten