Builder erkennt Typname nicht



  • Hallo Leute,
    ich arbeite zurzeit an einem Spiel, dass ich mit dem Borland Builder programmiere.
    Mittlerweile wurde mir die Unit1 etwas zu unübersichtlich, worauf ich eine neue
    Header- und Unitdatei erstellt habe, um mir den Quellcode etwas zu kapseln.
    Nun habe ich aber ein Problem, bei dem mir der Builder folgende Fehlermeldungen anzeigt:
    E2303 Typname erwartet
    E2139 In Denklaration fehlt ;
    Dass ein Semikolon fehlt ist ausgeschlossen. Auch die Units sind alle miteinander includet.
    Gibt es vielleicht eine Sache die ich vergessen habe, damit der Builder weiß, dass die
    neue Klasse ein neuer Typname ist?



  • Hallo

    Es gibt viele Gründe für diese Fehlermeldung. Aus deiner bisherigen Beschreibung wird aber nicht klar, welcher bei dir zutrifft.

    bis bald
    akari



  • Okay, ich zeige euch mal die Klassen:
    Hauptklasse:

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include "barrier.h"
    //---------------------------------------------------------------------------
    class TfrmMain : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
        TImage *img_background;
        TTimer *timer;
        TTimer *timer_laserCooldown;
        TMemo *memo;
        TTimer *timer_laserZeigen;
        void __fastcall timerTimer(TObject *Sender);
        void __fastcall timer_laserCooldownTimer(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall img_backgroundMouseMove(TObject *Sender,
              TShiftState Shift, int X, int Y);
        void __fastcall img_backgroundMouseDown(TObject *Sender,
              TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall timer_laserZeigenTimer(TObject *Sender);
    
    public:
    
        CBarrier *Komet;
    
        Graphics::TBitmap *background, *ship;
        int x_ship, y_ship, x_laser[2];
        int laserlaenge;
        bool shot;
    
        __fastcall TfrmMain(TComponent* Owner);
        void DrawLaser();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TfrmMain *frmMain;
    //---------------------------------------------------------------------------
    #endif
    

    CBarrier

    //---------------------------------------------------------------------------
    
    #ifndef barrierH
    #define barrierH
    #include <vcl.h>
    #include "Unit1.h"
    class CBarrier
    {
        private:
            int x , y, sizeX, sizeY, speed;
            bool aktiv;
            Graphics::TBitmap *Bild;
        public:
            CBarrier();
            ~CBarrier();
    
            void DrawBarrier();
            void SpawnBarrier();
            bool barrier_aktiv();
            int x_barrier();
            int y_barrier();
            int xx_barrier();
            int yy_barrier();
            void set_barrier_aktiv(bool);
    
    };
    //---------------------------------------------------------------------------
    #endif
    

    Bei "CBarrier *Komet;" in der Hauptklasse zeigt er mir die Fehler an. Eigentlich müssen sich die Klassen gegenseitig kennen, aber komischerweise zeigt es Fehler an.
    Muss ich vielleicht noch irgendwas im Builder einstellen?

    Danke nochmals



  • lass mal Zeile 6 in der barrier.h weg



  • Cool, jetzt läuft's.
    Wieso durfte ich die Unit1.h nicht inkludieren?
    Seltsam.



  • Hallo

    Du hattest folgende Situation :
    * CBarrier.h includet Unit1.h
    * Unit1.h includet CBarrier.h
    In Verbindung mit den Include Guards führt das zu der Fehlermeldung. Ein solches Vorgehen ist nicht möglich. Es gibt zwei Lösungen :
    * Die Reduzierung der Abhängig zwischen den Units, indem du wie vorgeschlagen einen include entfernst. Das ist generell der bessere Weg, den mit weniger Abhängigkeit wird dein Programm übersichtlicher und schneller kompiliert
    * Die Verwendung von Forward Declarations. Siehe Forumsuche für weitere Details.

    bis bald
    akari


Log in to reply