Warum bekomme ich hier einen Syntax Error?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Warum bekomme ich hier einen Syntax Error?

    Ich bin heute *endlich* mal dazu gekommen (seit Monaten) mich mal wieder in Sachen ObjC zu erproben. Ich will eine Liste bauen und hab mir gedacht, verpasst du der auch gleich mal einen Enumerator.

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import "MBNode.h"
    3. #import "MBList.h"
    4. @interface MBListEnumerator : NSEnumerator {
    5. MBNode * current;
    6. //MBList * test;
    7. }
    8. //+(id)enumeratorWithList:(MBList *)list;
    9. //-(id)initWithList:(MBList *)list;
    10. @end
    Alles anzeigen

    Solange ich die auskommentierten Zeilen auskommentiert lasse ist alles in Ordnung. Sobald ich eine der beiden Methoden entkommentiere, bekomme ich vom Compiler um die Ohren geschlagen:

    Quellcode

    1. error: syntax error before 'MBList'
    2. warning: '@end' must appear in an @implementation context

    Entkommentiere ich die Testvariable in der Variablendeklaration, bekomme ich nur den Syntax Error.

    Ich stehe irgendwie auf dem Schlauch. Wo ist der Fehler?
  • Die @end stimmen in allen Dateien. Auch die geschwiffenen Klammern sehen soweit ausbalanciert aus.

    Ich hab gerade gesehen, daß mir MBList.m bei import "MBList.h" auch einen Syntax-Fehler anzeigt, der aber nicht in den Build Results aufgeführt wird.

    Hier mal die MBList.h:

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import "MBNode.h"
    3. #import "MBListEnumerator.h"
    4. @interface MBList : NSObject {
    5. MBNode * head;
    6. MBNode * tail;
    7. unsigned int length;
    8. }
    9. -(void)insertFront:(id)data;
    10. -(void)insertRear:(id)data;
    11. -(void)deleteFront;
    12. -(void)deleteRear;
    13. -(id)getFront;
    14. -(id)getRear;
    15. -(BOOL)isEmpty;
    16. -(NSEnumerator *)objectEnumerator;
    17. @end
    Alles anzeigen
  • Was mir auffällt ist dass du in der MBList.h ein #import "MBListEnumerator.h" und in der MBListEnumerator.h ein #import "MBList.h" drin hast. Hab ich noch nie probiert, aber könnte das eine Endlosschleife ergeben?
    Widgetschmie.de • Life is too short for gadgets
  • Es geht ja nicht um mehrfach, sondern um rekursiv, kann also sein. Dann kann man noch "@class" nehmen.

    Bleibt die Frage, warum Du 'MBListEnumerator.h' in MBList.h importieren musst, wird doch gar nicht benötigt..
    I would be embarrassed if they did not spy on me.
  • Quellcode

    1. Bleibt die Frage, warum Du 'MBListEnumerator.h' in MBList.h importieren musst, wird doch gar nicht benötigt..

    Ich muss doch beim Erzeugen des Enumerators die Liste übergeben, die er durchlaufen soll.

    Ich hab eben den #import durch @class ersetzt, aber dann wirft er noch mehr Fehler aus.

    Ich stehe da irgendwie auf dem Schlauch. Ich hänge mal das Projekt an, wenn es wirklich an den Imports liegt, sollte man dann wohl alles sehen. Wäre toll, wenn da mal einer drüber gucken könnte.

    Ach Mist, ich bekomme es nicht klein genug komprimiert. Dann eben in zwei Teilen.
  • Original von Agrajag

    Quellcode

    1. Bleibt die Frage, warum Du 'MBListEnumerator.h' in MBList.h importieren musst, wird doch gar nicht benötigt..

    Ich muss doch beim Erzeugen des Enumerators die Liste übergeben, die er durchlaufen soll.

    Es reicht ja wenn der Kompiler weiss, dass das eine Klasse ist, er muss die ivars und Methoden ja (noch) nicht kennen, darum reicht @class.

    Bei mir kompiliert er Fehlerfrei mit folgenden 2 Änderungen:
    (Die zweite ist vorläufig unnötig, aber du willst dann wohl auf die NSListEnumerator-Objekte Zugriff haben, momentan ist das auskommentiert).

    MBList.h:

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import "MBNode.h"
    3. @class MBListEnumerator;
    4. @interface MBList : NSObject {
    5. ...


    MBList.m:

    Quellcode

    1. #import "MBList.h"
    2. #import "MBListEnumerator.h"
    3. @implementation MBList
    4. ...


    Hilft das?

    Edit:
    Dasselbe würd ich auch mit MBNode machen, also ein @class MBNode; in der Header von MBListEnumerator und das #import erst in der .m
    Widgetschmie.de • Life is too short for gadgets
  • Mit diesen beiden Änderungen bekomme ich jetzt sogar 6 Errors. Was geht hier ab?!?

    jeweils in MBList.h und MBListEnumerator.h:

    Quellcode

    1. error: syntax error before 'AT_NAME' token
    2. error: syntax error before '}' token
    3. fatal error: method definition not in @implementation context


    Ok, scheinbar stehe ich mit den imports auf dem Kriegsfuß, nur warum offenbart es sich erst jetzt in dieser Härte? Ich hatte immer gemeint, es ist keine schlechte Idee alle Includes im Header zu machen und in der Implementation den Import des eigenen Headers.

    *grummel*
  • Vielleicht noch eine kleine Frage zur meiner Vorgehensweise mit dem Enumerator. In Java macht man sowas ja gerne mit einer anonymen lokalen Klasse (Iterator) und einer lokalen Klasse (ElementWrapper), was ja im Sinne der Kapselung ja recht schön ist. In meinem Fall sind alle an der Liste beteiligten Klassen direkt einseh- und benutzbar, was z.B. beim MBListEnumerator schlecht ist, da dieser ausschliesslich zu meiner MBList passt. Ist meine Vorgehensweise für ObjC/Cocoa so korrekt, oder was würde/könnte/sollte man anders machen?

    Ich hab mir mal die Sourcen zu GnuStep angesehen, aber so richtig erhellendes ist da für mich auch nicht dabei gewesen. Die machen in den Klassen so gut wie alles in reinem C. Ist zwar toll für die Geschwindigkeit, hat mir beim Verstehen, wie man den Enumerator korrekterweise implementieren würde, keine weiteren Erkenntnisse gebracht. Für Java wird man mit Beispielen zur Implementierung von Iteratoren nur so zugeschmissen. Wie kommt es, daß man keine Beispiele für ObjC findet?