Fehler: "expected unqualified-id before ..."



  • Hallo alle,

    Zunächst einmal der (simple) Code:

    zahl.h:

    class Zahl {
    
        private:
          int m;
    
        public:
          Zahl();
          ~Zahl();
          int increase(int);      
    };
    

    zahl.cpp:

    #include "zahl.h"
    #include <iostream>
    
    public Zahl::Zahl () {
      this->m = 0;  
    }
    
    public int Zahl::increase(int i) {
      this->m = this->m + i;
      return this->m;
    }
    
    int main() {
    
      Zahl z;  
      std::cout << "Zahl: " << z.increase(15) << std::endl;  
      return 0;
    }
    

    Beim Kompilieren mit g++ (gcc-Version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)) kommen folgende Fehler:

    zahl.cpp:4: Fehler: expected unqualified-id before »public«
    zahl.cpp:8: Fehler: expected unqualified-id before »public«

    Weiß jemand, woran das liegt?

    Grüße,
    TheBrain



  • Bei Methoden-Definitionen außerhalb der Klasse darf kein public mehr stehen.



  • TheBrain schrieb:

    Beim Kompilieren mit g++ (gcc-Version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)) kommen folgende Fehler:

    zahl.cpp:4: Fehler: expected unqualified-id before »public«
    zahl.cpp:8: Fehler: expected unqualified-id before »public«

    Weiß jemand, woran das liegt?

    Grüße,
    TheBrain

    Ja, im Sourcecode gehört kein public vor die Funktionen.

    Zahl::Zahl()
    {
      this->m = 0;  
    }
    

    Aber davon abgesehen:
    a) Normalerweise liest man den Header um einen kurzen Überblick zu bekommen, und schaut nur wenn nötig in den Source. Jemand der Variablenbezeichner im Header weglässt, macht es anderen schwerer Code zu lesen.
    b) Sinnvolle Bezeichner wären auch gut, wenn gleich in deinen wirklich kleinen Code mit "i" noch leben könnte. Gewöhn dir aber lieber sprechende Bezeichner an, die erleichtern dir und anderen das Lesen.
    c) Bitte verwende die C/C++ statt der Code-Tags um C/C++ Code im Forum besser lesbar zu machen.
    d) Warum machst du im Konstruktor eine Zuweisung statt einer Initialisierung (Thema: Initialisierungsliste):

    Zahl::Zahl()
    {
      this->m = 0; // Zuweisung
    }
    
    Zahl::Zahl()
    : m(0) // Initialisierung
    {
    }
    

    e) Der += Operator ist dir auch ein Begriff?

    int Zahl::increase(int i)
    {
      this->m = this->m + i;
      return this->m;
    }
    
    int Zahl::increase(int i)
    {
      this->m += i; // In der Regel vorzuziehen (Eine temporäre Variable weniger)
      return this->m;
    }
    

    cu André



  • Danke, das mit dem public wusste schon gar nicht mehr. Bin in letzter Zeit leider Java gewohnt.

    Und zu den ganzen Verbesserungsvorschlägen: Ich hab dieses Beispiel hier nur kurz zur Demonstration des Fehlers gepostet. In richtigen Programmen mache ich mir schon Gedanken über good style und Effizienz 😉 Trotzdem danke, ist ja gut gemeint.



  • Ich hab noch ein kleines Problemchen mit meiner Header-Datei:
    Bei folgendem Code wirft der Compiler immer noch den "expected unqualified-id before »[« token"-Fehler:

    class EineKlasse {
    
      private:
        bool[] DoSomething(int num, bool[] BinArray);
    
      [...]
    
    };
    

    In der GCC-Version 4.1.3 sollte doch der bool-Datentyp so langsam mal fest implementiert sein, oder? Oder liegts an was anderem?



  • TheBrain schrieb:

    In der GCC-Version 4.1.3 sollte doch der bool-Datentyp so langsam mal fest implementiert sein, oder? Oder liegts an was anderem?

    Der bool-Typ ist auch nicht das Problem, sondern das Array (probier mal die übergabe als Zeiger auf das erste Element...). Arrays sind aber egal wie problematisch (u.a. hast du keine Möglichkeit die tatsächliche Länge zu bestimmen, und musst dies immer mitschleifen) ==> Besser std::vector.



  • Danke, das wars 🙂


Log in to reply