Fehler beim Erzeugen eines neuen Objektes bzw. Instanz



  • Zu einem vorgegebenen Programmcode wurde eine weitere Klasse hinzugefügt. Damit man auf diese auch zugreifen kann, soll ein weiteres Objekt erzeugt werden. Doch beim Kompilieren entsteht jedesmal folgende Fehlermeldung:

    [BCC32 Fehler] FrmSpiel.h(46): E2303 Typname erwartet
    [BCC32 Fehler] FrmSpiel.h(46): E2139 In Deklaration fehlt ;
    

    Die neue Klasse enthält dabei folgenden Code:
    Test.h:

    //---------------------------------------------------------------------------
    
    #ifndef TestH
    #define TestH
    //---------------------------------------------------------------------------
    #endif
    
    class Test {
    	public:
    	int bla(int zahl);
    };
    

    Test.cpp:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include "Test.h"
    
    //---------------------------------------------------------------------------
    
    #pragma package(smart_init)
    
    int Test::bla(int zahl) {
        return zahl*2;
    }
    

    In Form1 wurde die Klasse dabei mit folgenden zusätzlichen Eintragungen eingebunden:
    FrmSpiel.h (gekürzt):

    ...
    private:	// Benutzer Deklarationen
            ...
    	Test myTest; //<- bemängelte Zeile 46
            ...
    

    FrmSpiel.cpp (gekürzt):

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Test.h"
    ...
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    ...
    

    Wenn ich nach diesem Schema in eigenen Projekten neue Klassen hinzufüge und daraus Objekte erzeugen möchte, funktioniert dies kurioserweise problemlos.

    Was könnte ich übersehen haben?



  • Hallo

    Objekte müssen in C++ immer auf dem Heap mit "new" erstellt werden.
    Sprich.

    //.h-Datei
    ...
    private:    // Benutzer Deklarationen
            ...
        //Initialisierung
        Test *myTest;
            ...
    
    /*
    *
    *
    *cpp.Datei
    *
    *
    */
    //Dort wo du dies brauchst, erstellst du die Instanz entgültig.
    //und zwar mit
    myTest =new Test()
    

    So hasst du anschliessend eine Instanz der Klase Test erstellt.



  • Das ändert leider nichts am Problem. Es werden genau die selben Fehler in genau der gleichen Zeile gemeldet wie zuvor. Ausser das in der Zeile nun eben dieser Code steht:

    Test *myTest;
    


  • Hallo

    Ich habe gerade noch etwas gesehen.
    1. Hast du die Datei "Test.h" nur in der .CPP eingebunden oder auch in der .h ?
    2. In der Test.h steht "#endif" vor der Klasse. Meines wissens nach, muss das aber ganz am ende der Headerdatei stehen.



  • Danke. Das war es wohl. 👍

    Nach dem zusätzlichem #include "Test.h" in die FrmSpiel.h und Verlegung der #endif-Anweisung an das Ende der Klasse hat es funktioniert.

    Doch da eröffnet sich mir gleich eine weitere Frage:

    Die schon vorhandene Klasse wurde nicht extra in das FrmSpiel.h eingebunden. Ausserdem wurde innerhalb der Klasse sämtliche Präprozessor-Anweisungen entfernt und das Ding funktioniert absolut fehlerfrei.

    Wenn ich nun aus meiner Klasse diese Präprozessor-Anweisungen ebenfalls entferne und das include aus dem FrmSpiel.h entferne, bekomme ich wieder den o.g. Fehler.

    Zwei gleiche Vorgänge und dennoch unterschiedliche Egebnisse? Scheint mir nicht ganz logisch.

    Btw: Bisher hatte ich ebenfalls noch nie in den Form-Header manuell etwas hinzugfügen müssen. CodeGear legt die zwei Bereiche für die benutzerdefinierten Deklarationen an (private: und public:) und um den Rest musste ich mich bisher nie kümmern.

    Ist mir ehrlich gesagt schleierhaft, was nun daran anders sein soll, zumal ich es etwas kritisch sehe, wenn ich manuell in dem von CodeGear vewalteten Bereich eingreife.


Log in to reply