Erste Versuche mit header-Dateien.



  • Hi.

    Ich lerne für die Uni C++ und tüftele gerade an Programmen aus Header- und Implementierungsdateien herum.
    Dabei habe ich ein Problem, bei dem ich nicht weiterweiss.
    Folgender Quellcode:

    #include <Rechnen.h>

    int main()

    Rechnen::Rechnen()
    {
    cout << "Geben sie den ersten Faktor ein: "<< endl;
    cin >> x;
    cout << "Jetzt den zweiten Faktor: "<< endl;
    cin >> y;
    }

    int Rechnen::Multiplizieren(int x, int y)
    {
    z = x*y;
    return z;
    }

    void Rechnen::Ergebnis(int z)
    {
    cout << z << endl;
    cin >> z;
    };

    Die Fehlermeldung hierbei ist folgende:

    8 C:\Programme\Dev-Cpp\VERSUCHE\Rechnen\Rechnen.cpp expected init-declarator before "Rechnen"

    und

    8 C:\Programme\Dev-Cpp\VERSUCHE\Rechnen\Rechnen.cpp expected ,' or;' before "Rechnen"

    Wenn mir jemand helfen kann, wäre ich echt dankbar. Ich weiss, dass der Code eventuell totaler SChrott ist, also lasst es mich ruhig wissen.

    LG, Micha



  • #include <Rechnen.h>
    
    int main()
    { // der Inhalt von main muss in geschweifte Klammern
    
    Rechnen::Rechnen()
    {
      int x = 0; // Variablen vorher deklarieren
      int y = 0;
      std::cout << "Geben sie den ersten Faktor ein: "<< endl;
      std::cin >> x;
      std::cin.get(); // sonst bleibt das letzte Zeichen im Puffer von cin (der                                                  // Zeilenumbruch)
      std::cout << "Jetzt den zweiten Faktor: "<< endl;
      std::cin >> y;
      std::cin.get();
    }
    
    int Rechnen::Multiplizieren(int x, int y)
    {
      int z = 0; //s.o.
      z = x*y;
      return z;
    }
    
    void Rechnen::Ergebnis(int z)
    {
      std::cout << z << endl;
      std::cin >> z;
      std::cin.get();
    };
    
    } // main
    

    std:: ist die qualifikation des namespaces. alternativ kannst du auch vor der main "using namespace std;" benutzen, dann musst du es nicht jedesmal davor schreiben.

    gruss bumbytie



  • Danke für den Beitrag. Ich hab x, y in der headerdatei initialisiert. Auch "using namespace std" habe ich dort angegeben.

    Hab jetzt mal deinen code probiert. Klappt aber immer noch nicht ganz. Ich werde nochmal etwas weiter tüfteln.

    Micha.



  • #include <Rechnen.h>
    
    int x = 0;
    int y = 0;
    int z = 0;
    
    int main()
    
    {
    
      cout << "Geben sie den ersten Faktor ein: "<< endl;
      cin >> x;
      cin.get();
      cout << "Jetzt den zweiten Faktor: "<< endl;
      cin >> y;
      cin.get();
    
    Rechnen::Rechnen();
    
    int Rechnen::Multiplizieren(int x,int y);
    {
      z = x*y;
      return z;
    }
    
    void Rechnen::Ergebnis(int z);
    {
      cout << z << endl;
      cin >> z;
      cin.get();
    }
    
    } // main
    

    das ist jetzt meine implementierungsdatei. Die einzigen fehlermeldungen sind folgende für beide Funktionen:

    22 C:\Programme\Dev-Cpp\VERSUCHE\Rechnen\Rechnen.cpp declaration of `int Rechnen::Multiplizieren(int, int)' outside of class is not definition

    28 C:\Programme\Dev-Cpp\VERSUCHE\Rechnen\Rechnen.cpp declaration of `void Rechnen::Ergebnis(int)' outside of class is not definition

    Weiß jemand was noch falsch sein könnte? Hier ist übrigens meine Header-datei:

    #ifndef _Rechnen_H
    #define _Rechnen_H
    
    #include <iostream>
    
    using namespace std;
    
    class Rechnen
    {
          int x,y,z;
    
          public:
                 Rechnen();
                 int Multiplizieren(int,int);
                 void Ergebnis(int);
    
    };
    
    #endif
    

    hab noch nicht ganz verstanden warum das "if" hier ist.

    Micha



  • Nimm das using namespace std; aus dem Header raus und pack es in die cpp. Wenn überhaupt, dürfen using namespace Direktiven höchstens in der cpp sein. Die iostream brauchst du hier eigentlich auch nicht.
    Die beide Funktionensdefinitionen (Multiplizieren und Ergebnis) müssen aus der main raus. Du darfst Funktionen nicht innerhalb von anderen Funktionen definieren.
    Wo ist die Definition von Rechnen()?
    bumbytie und Narados: Lest euch beide nochmal ein Tutorial durch.



  • Hab das so verstanden, dass jede Klasse einen Konstruktor braucht, der so wie "Rechnen()" dargestellt wird.

    Das mit dem Tutorial nehm ich mir gerne zu Herzen.



  • ...und wo müssten die beiden Funktionen Multiplizieren und ERgebnis definiert werden?



  • Wenn du ne Klasse schreibst, mach es erstmal so:

    Die Deklarationen kommen in die so genannte Header-Datei:

    Rechnen.h

    #ifndef Rechnen_h
    #define Rechnen_h
    
    class Rechnen
    {
    public:
        Rechnen();
        int Multiplizieren(int x, int y);
    };
    
    #endif
    

    Die Definition der Konstruktoren und Methoden kommen in eine zugehörige cpp-Datei:

    Rechnen.cpp

    #include "Rechnen.h" // beachte die Hochkommata
    
    Rechnen::Rechnen()
    {
        // Code im Konstruktor
    }
    
    int Rechnen::Multiplizieren(int x, int y)
    {
        // Code fürs Multiplizieren
    }
    

    Nun hast du ne Klasse, die du - zum Beispiel in deiner main-Funktion - benutzen kannst:

    MeinErsterCode.cpp:

    #include "Rechnen.h" // Klasse einbinden
    
    int main(int argc, char** argv)
    {
        // Instanz erstellen
        Rechnen r;
    
        // Methode vom Objekt r benutzen
        r.Multiplizieren(4711, 815);
    
        return 0;
    }
    

    In der Klasse fehlt jetzt natürlich die Funktionalität und andere wichtige Sachen, z.B. der Destruktor.
    Soll die nur mal verdeutlichen, wie die Struktur der Dateien aussieht.



  • über oder unter der main oder in einer separaten Datei.
    Jede Klasse braucht einen Konstruktor. Allerdings erzeugt der Compiler dir schon standardmäßig einen, der in deinem Fall auch ausreicht. Wenn du aber einen eigenen Konstruktor haben willst, dann mußt du ihn nicht nur deklarieren, sonder auch definieren. Dies kannst du auch beides zusammen in deinem Header machen.

    #ifndef _Rechnen_H
    #define _Rechnen_H
    
    class Rechnen
    {
      int x,y,z; // wofür brauchst du hier die Variablen?
    
      public:
        Rechnen(); // hier nur deklariert
        Rechnen()
        {
          // jetzt deklariert und definiert und unnötig, da er nichts macht
        }
        int Multiplizieren(int,int);
        void Ergebnis(int);
    
    };
    #endif
    

    und jetzt noch die cpp

    #include <Rechnen.h>
    #include <iostream> // hier rein
    
    using namespace std;
    
    int Rechnen::Multiplizieren(int x,int y);
    {
      z = x*y;
      return z;
    }
    
    void Rechnen::Ergebnis(int z);
    {
      cout << z << endl;
      cin >> z;
      cin.get();
    }
    
    int main()
    {
    // Variable besser nicht global deklarieren
      int x = 0;
      int y = 0;
      int z = 0;
      cout << "Geben sie den ersten Faktor ein: "<< endl;
      cin >> x;
      cin.get();
      cout << "Jetzt den zweiten Faktor: "<< endl;
      cin >> y;
      Rechnen rech; // Objekt deiner Klasse erstellen
      z = rech.Multiplizieren(x, y); // Funktion Multiplizieren aufrufen
      rech.Ergebnis(int z); //Ergebnis ausgeben
    //  cin.get(); // jetzt nicht mehr nötig, da das schon in Ergebnis drinsteht
    } // main
    


  • Vielen Dank für eure Hilfe. Ihr habt mich alle zwar etwas verwirrt, weil es soviele verschiedene Ansätze gab, aber ich hab es schlussendlich doch geschafft (durch euch).


Anmelden zum Antworten