Turbo C++ kommt nicht mit Prototypen klar



  • Hallo Leute!
    Ich hatte schon mehrfach das Problem, dass Turbo C++ Fehlermeldungen à la

    [C++ Fehler] header.h(1104): E2238 Bezeichner 'xyz' mehrfach deklariert
    

    ausspuckt. Eigentlich habe ich dann aber icht etwas mehrfach deklariert, sondern vorher schon mal einen Prototypen vereinbart. Also zum Beispiel:

    class xyz;
    // ...
    class xyz
    {                  // Diese Zeile wird von Turbo C++ als fehlerhaft markiert.
      public:
        int x, y, z;
        // usw.
    };
    

    Habe ich wirklich irgendwas falsch gemacht, oder hat Turbo C++ seine Tage?😕

    Mr Train



  • Habe den Turbo C++ jetzt nicht installiert, aber kann es sein, dass du die Include Guards vergessen hast und den Header mehrfach einbindest?



  • Ne, jeder Header wird nur einmal eingebunden (ich hab's gerade nch mal überprüft). Der Code, den ich gepostet hab' steht auch in der selben Headerdatei. Trotzdem, danke für den Tipp!

    Mr Train



  • Mr Train schrieb:

    Habe ich wirklich irgendwas falsch gemacht, oder hat Turbo C++ seine Tage?😕

    Also, _so_ buggy ist der ja nun auch nicht 😉

    Vielleicht heißt bei dir einfach noch etwas anderes xyz. Kommentiere doch die Klasse mal aus und sieh nach, wohin dich Code Completion oder Code Browsing verweisen, wenn du den Bezeichner benutzt.

    Und ansonsten poste mal ein Minimalbeispiel. Obiger Codeausschnitt stellt keines dar - mein C++Builder 2006 übersetzt ihn ohne Bedenken.



  • Also, es heißt nichts anderes "xyz". Mein Code:

    class xyz;
    int xyzMax = 1;
    xyz* xyzs = new xyz[xyzMax];  // Hier ist 2mal der Fehler "[C++ Fehler] header.h(38): E2450 Undefinierte Struktur 'xyz'".
    class xyz
    {          // Hier ist der Fehler "[C++ Fehler] header.h(1104): E2238 Bezeichner 'xyz' mehrfach deklariert".
      // Der Code hier wird ja nicht so wichtig sein ...
    };
    

    Möglicherweise habe ich auch in Zeile 3 etwas falsch gemacht?

    Mr Train



  • Du versuchst, eine Instanz der Klasse anzulegen, bevor du sie dem Compiler bekannt machst. Eine Vorwärtsdeklaration reicht dafür nicht aus, lediglich für die Deklaration von Zeigern und Referenzen auf den Typen.



  • Mr Train schrieb:

    Habe ich wirklich irgendwas falsch gemacht, oder hat Turbo C++ seine Tage?😕

    Turbo C++ (Welches 2006?) hat zwar einige Probleme, aber Vorwärtsdeklarationen funktionieren. Vorwärtsdeklarationen funktionieren aber nur, solange du nur Zeiger und Referenzen verwendest, und nicht auf irgendwelche Details der Klasse zurück greifst (z.B. Funktionsaufrufe...).

    Mr Train schrieb:

    class xyz;
    int xyzMax = 1;
    xyz* xyzs = new xyz[xyzMax];  // Hier ist 2mal der Fehler "[C++ Fehler] header.h(38): E2450 Undefinierte Struktur 'xyz'".
    class xyz
    {          // Hier ist der Fehler "[C++ Fehler] header.h(1104): E2238 Bezeichner 'xyz' mehrfach deklariert".
      // Der Code hier wird ja nicht so wichtig sein ...
    };
    

    Das geht nicht, da du bereits Konstruktoren aufrufen willst, ohne das der Kompiler die Klasse kennt. Bei einer sauberen Trennung Header/Source ist das aber kein Problem.

    // a.h
    #ifndef A_HEADER
    #define A_HEADER
    
    class A {
      public:
        A();
    };
    
    #endif
    
    // a.cpp
    #include "a.h"
    
    A::A()
    {
    }
    
    // b.h
    #ifndef B_HEADER
    #define B_HEADER
    
    class A;
    class B {
      public:
        B();
        ~B();
      private:
        A * a;
    };
    
    #endif
    
    // b.cpp
    #include "b.h"
    #include "a.h"
    
    B::B()
    : a(new A())
    {
    }
    
    B::~B()
    {
      delete a;
    }
    

    cu André



  • Danke für die Infos!!!💡 Ich hab' die Reihenfolge jetzt 'n bisschen geändert und jetzt geht's. 🙂 👍

    Mr Train


Anmelden zum Antworten