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(); }; } // mainstd:: 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(); } } // maindas 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); }; #endifhab 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); }; #endifDie 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); }; #endifund 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).