error C2143: Syntaxfehler: Es fehlt ';' vor '*'



  • hat sich erledigt



  • Robel schrieb:

    wenn ich die 2. zeile auskommentiere dann gibt er mir die gleiche fehlermeldung, also denke ich mal er included die XRTable.h erst garnicht 😕

    Ich glaube eher das deine XRTable falsch ist. Includieren tut er es nämlich (sonst würde er schreiben das die Datei "XRTable.h" nicht gefunden werden konnte. Und wenn XRTable nicht richtig definiert ist, kann der Fehler gleich sein:

    XRTable * table; // ISO C++ forbids declaration of ‘XRTable’ with no type

    XRTable ist schlicht und ergreifend undefiniert.

    Der Fehler "Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt." deutet auf ein anderes Problem. Irgendwo wurde eine Typangabe oder ein Rückgabewert nicht angegeben.

    So schauen wir uns mal Ausnahmsweise deine Dateien an. Erstens bitte .ncb nicht mit kopieren, die gehören definitiv nicht in ein zip.

    So erstmal ein erstes Fazit:

    • Warnstufe bitte auf 4 erhöhen (In den Projekteinstellungen; C++/Allgemein/Warnstufe...)
    • Einheitliche und SPRECHENDE Namen verwenden (Nicht mal Klassen groß, dann klein schreiben; Sichtbare unterschiede zwischen Variablennamen und Konstanten helfen auch das Lesen zu erleichtern)
    • NIEMALS "using namespace" im Header
    • "system("pause")" sollte man nicht verwenden (Schau mal bitte in die Konsolen-FAQ
    • Dein Code ist zu groß um ihn einfach mal zu analysieren. Immer den Code vorher so weit wie möglich auf das wesentliche verkleinern (Manchmal findet man so auch den Fehler)
    • Klassen die nicht zur Ableitung gedacht sind brauchen sollten auch nicht zum Ableiten verleiten (lieber im Regelfall alles private statt protected machen, es sei den du willst diese Klasse definitiv als Basisklasse verwenden; dann sollte sie aber auch einen virtuellen Destruktor besitzen).
    • Sofern dein Prof nicht darauf besteht würde ich (void) durch () ersetzen.
    • Nur das im Header inkludieren was wirklich notwendig dort benötigt wird (den Rest kann man immer noch im Source einbinden)
    • Es ist eine Unsitte Parameter unbenannt im Header stehen zu lassen, der Header ist es den man liest um einen Überblick zu bekommen (Ja, verboten ist das weglassen nicht, aber es ist auch kein guter Stil)
    • Du arbeitest gerne mit Zeigern, wo auch Referenzen reichen würden, oder? Ob du nun einen Zeiger auf ein internes Datenelement oder eine Referenz zurückgibst ist egal, dann sollte man aber lieber der Syntax wegen Referenzen nehmen.
    • Der Begriff Initialisierungsliste (Konstruktor) sagt dir etwas? Zumal es eigentlich üblich ist dort aus konstistenzgründen alle Variablen in ihrer Deklarationsreihenfolge aufzuführen (und sei es mit dem aufruf des Standardkonstruktors). So ist sicher gestellt das auch wirklich keine Variable in der Initialisierung vergessen wurde.
    • Für die Methode "string TokenReader::GetToken(void)" gehört man geschlagen. Und du meinst sicher das du eine so lange Methode überblicken kannst? Lieber in kleinere überschaubare private Methoden umwandeln.
    • Parameter die nicht zu den integralen Basistypen (wie int, float...) gehören sollten immer als konstante Referenz übergeben werden, oder Alternativ als Referenz wenn sie Bearbeitet werden sollen.
    • C++ hat keinen Garbage Collector, wenn du schon mit Zeigern und Allozierungen um dich schmeist, so musst du dich auch um das Aufräumen selber kümmern!

    Und das hier meinst du hoffentlich nicht ernst:

    PDFObj* arrayObj::getObj(unsigned int)
    {
        PDFObj* obj;
        return obj;
    }
    

    1. Unitialisierter Pointer der irgendwo in den Speicher zeigen kann (noch nicht mal mit 0 initialisiert)
    2. Übergabeparameter der nicht verwendet wird, und wo auch kein Name darauf deutet was er machen soll (und sei es das der Name in C-Komentaren eingeschlossen ist).
    3. Wer soll sich hierbei eigentlich um die Allozierung und Deallozierung kümmern?

    class PDFObj
    {
    public:
        PDFObj(void);
    public:
        ~PDFObj(void);
    };
    

    Dies ist KEINE Basisklasse. Wenn bitte mit virtuellen Destruktor arbeiten, wobei mir eh das Verständnis fehlt wozu man eine Basisklasse verwendet, wenn diese keine virtuellen Methoden bereitstellt.

    Letzter nachtrag: Den Code werde ich erstmal nicht weiter analysieren... Habe noch besseres mit meinen Sonntag vor.

    cu André
    P.S: Müssen es immer Zeiger sein, bist du so masochistisch veranlagt das du sie überall einsetzt? ;p



  • so erstmal danke für die antwort.

    naja das die XRTable falsch ist, ist eher unwahrscheinlich weil ich in der main.cpp ja ein XRTable objekt erzeuge und es auch benutze.
    das kannst du ganz einfach testen in dem du die zeile "XRTable * table;" in indirectRef.h einfach auskommentierst oder du kannst in die indirectRef.cpp einfach mal folgendes schreiben:

    #include "indirectRef.h"
    
    indirectRef::indirectRef()
    {
    	XRTable * tab;
    }
    ...
    

    dafür kommt keine fehlermeldung also müsste der Fehler doch irgendwo in der indirectRef.h sein, oder?



  • Robel schrieb:

    ....also müsste der Fehler doch irgendwo in der indirectRef.h sein, oder?

    Leider werden Fehler bei C++ nicht immer da angezeigt wo sie wirklich auftreten. Und der XRTable wird includiert, aber er kann nichts damit anfangen (Der Typ wird nicht erkannt). Daher meckert er über XRTable unabhängig davon ob du den Header inkludierst oder nicht (und es wird mit hoher Sicherheit die gleiche Fehlermeldung sein).

    Es kann schon sein das du am Ende einer Klasse ein Semikolon vergessen hast, oder irgendwo ein { oder } zuviel. Aber dein Code ist weder sauber genug um ihn mal eben schnell durchzuschauen noch kurz genug. Durch die schlechte Namensgebung kommt man dann auch noch zusätzlich ins Stolpern, und ich wollte Heute noch was anderes als Korrigieren machen 😉

    cu André



  • Vielleicht hat auch nur die XRTable.h deinen Header eingebunden - und dank Include-Guards und der Verarbeitungsreihenfolge des Präprozessors steht die Definition von XRTable jetzt hinter der Definition von indirectRef.



  • Wenn du eh nur einen Pointer auf die Klasse dort hast und sie sonst im Header nicht verwendest, kannst du zur Not auch mit class XRTable; am Anfang der Datei dem Compiler vermitteln was er da eigentlich vor sich hat. Dann brauchst auch nicht inkludieren (im Header).



  • ne kein plan, nach dem ich dein code angeschaut habe


Anmelden zum Antworten