[C++] Klassendeklarierung falsch?
Hallo,
ich mache grade meine ersten Schritte in C++ und OOP in C++. Ich habe versucht mir eine Taschenrechnerklasse zu programmieren, nachdem ich einen kleinen Taschenrechner auf Konsolenebene in prozeduraler Progrmamierung geschafft habe. Allerdings funktioniert die Klasse nicht. Schon beim Deklarieren in main() kommt der Fehler D:\C++\tr\taschenrechner\main.cpp|8|error: `Taschenrechner' was not declared in this scope|. Ich denke, dass ich es richtig deklariert habe, aber anscheinend ist es doch nicht so...
Hier ist mein Code:
kann mir bitte jemand helfen und mir den Fehler sagen?
dermainzer
ich mache grade meine ersten Schritte in C++ und OOP in C++. Ich habe versucht mir eine Taschenrechnerklasse zu programmieren, nachdem ich einen kleinen Taschenrechner auf Konsolenebene in prozeduraler Progrmamierung geschafft habe. Allerdings funktioniert die Klasse nicht. Schon beim Deklarieren in main() kommt der Fehler D:\C++\tr\taschenrechner\main.cpp|8|error: `Taschenrechner' was not declared in this scope|. Ich denke, dass ich es richtig deklariert habe, aber anscheinend ist es doch nicht so...
Hier ist mein Code:
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream> using namespace std; int main() { Taschenrechner tr; cout << "Bitte geben Sie die erste Zahl ein:" << endl; cin >> tr.zahl1; cout << "Bitte geben Sie die zweite Zahl ein:" << endl; cin >> tr.zahl2; cout << "Bitte geben Sie jetzt den Rechenoperator ein. Zur Verfügung steht: \n * \n / \n + \n -" << endl; cin >> tr.op; tr.rechne(tr.zahl1, tr.zahl2, tr.op); return 0; } class Taschenrechner { public: double zahl1, zahl2; char op; public void rechne(double zahl1, double zahl2, char op) { if(op == '*') cout << zahl1 * zahl2 << endl; if(op == '/') cout << zahl1 / zahl2 << endl; if(op == '+') cout << zahl1 + zahl2 << endl; if(op == '-') cout << zahl1 - zahl2 << endl; } }; |
kann mir bitte jemand helfen und mir den Fehler sagen?
dermainzer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dermainzer« (21. Juli 2009, 14:43)
Schreib unter
Übrigens,
ist eher C#/Java.
Da oben bereits public: steht, kannst du also
schreiben.
|
|
C/C++-Quelltext |
1 |
using namespace std; |
|
|
C/C++-Quelltext |
1 |
class Taschenrechner;
|
Übrigens,
|
|
C/C++-Quelltext |
1 |
public void rechne(double zahl1, double zahl2, char op) |
Da oben bereits public: steht, kannst du also
|
|
C/C++-Quelltext |
1 |
void rechne(double zahl1, double zahl2, char op) |
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Die Vorwärtsdeklaration von Taschenrechner reicht hier nicht, weil du in main ja gleich ein Objekt davon erzeugst. Also musst du die Klasse Taschenrechner komplett deklarieren, bevor du sie in main verwenden kannst.
Edit: Die Vorwärtsdeklaration wäre hier mit einem Zeiger möglich, was allerdings nur etwas bringt, wenn man die Klassendeklaration in eine header Datei auslagert
Ein Beispiel dazu:
Da dir die Vorwärtsdeklarartion in der main nix bringt, wird eine zusätzliche Klasse Benutzeraktion erstellt. Von welcher in main ein Objekt erstellt wird.
main.cpp
In der header Datei der Benutzeraktion Klasse kann dann Taschenrechner vorwärtsdeklariert werden, weil im header davon nur ein Zeiger erstellt wird,
Benutzeraktion.h
Die Funktionsdeklaration findet dann getrennt statt und dort braucht auch erst die Klasse Taschenrechner deklariert werden bzw wie hier inkludiert.
Benutzeraktion.cpp
Taschenrechner.h
Taschenrechner.cpp
Mir ist klar, dass das nicht wirklich dein Problem war und der Nutzen der Vorwärtsdeklaration, nämlich der der kürzeren Komplierzeit, in diesem Beispiel nicht zum tragen kommt, aber mir war gerade danach
Edit: Die Vorwärtsdeklaration wäre hier mit einem Zeiger möglich, was allerdings nur etwas bringt, wenn man die Klassendeklaration in eine header Datei auslagert

Ein Beispiel dazu:
Da dir die Vorwärtsdeklarartion in der main nix bringt, wird eine zusätzliche Klasse Benutzeraktion erstellt. Von welcher in main ein Objekt erstellt wird.
main.cpp
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 |
#include <stdio.h> #include "Benutzeraktion.h" int main() { Benutzeraktion Aktion; Aktion.ichWillRechnen(); } |
In der header Datei der Benutzeraktion Klasse kann dann Taschenrechner vorwärtsdeklariert werden, weil im header davon nur ein Zeiger erstellt wird,
Benutzeraktion.h
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#ifndef BENUTZERAKTION_H #define BENUTZERAKTION_H class Taschenrechner; class Benutzeraktion { public: void ichWillRechnen(); Taschenrechner *tr; }; #endif |
Die Funktionsdeklaration findet dann getrennt statt und dort braucht auch erst die Klasse Taschenrechner deklariert werden bzw wie hier inkludiert.
Benutzeraktion.cpp
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 |
#include "Benutzeraktion.h" #include "Taschenrechner.h" void Benutzeraktion::ichWillRechnen() { tr = new Taschenrechner(); tr->rechne(); } |
Taschenrechner.h
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef TASCHENRECHNER_H #define TASCHENRECHNER_H class Taschenrechner { public: double zahl1, zahl2; char op; void rechne(); }; #endif |
Taschenrechner.cpp
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 |
#include "Taschenrechner.h" #include <stdio.h> void Taschenrechner::rechne() { printf("Taschenrechner rechnet"); } |
Mir ist klar, dass das nicht wirklich dein Problem war und der Nutzen der Vorwärtsdeklaration, nämlich der der kürzeren Komplierzeit, in diesem Beispiel nicht zum tragen kommt, aber mir war gerade danach
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ivanhoe« (21. Juli 2009, 21:59)
hi meinzer. ich habe mal vor 3 jahren in der schule ein kleine c++ schulprojekt geschrieben zum thema vererbung und OOP. ich poste mal den quellcode aber viel kann ich dir nicht dazu sagen schaue es dir mal an. MFG
header.h (klassen deklaration)
die einzelnen klassen mit methoden
flaeche.cpp
dreieck.cpp
quadrat.cpp
rechteck.cpp
volumen.cpp
pyramide.cpp
quadrat.cpp
quader.cpp
und die main.cpp welche die klassen verwendet
also wenn du fragen hast dann frag soweit ich mich noch dran erinnern kann, kann ich dir das eine oder andere erzählen aber ich hoffe dieses beispiel hilft dir vorerst weiter
MFG
header.h (klassen deklaration)
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 class volumen { protected: double a; public: volumen(double); }; //############################################ class pyramide:public volumen { private: double h; double volumen_p; public: void berechne_vp(double,double); double zeige_vp(void); pyramide(double,double); }; //############################################ class wuerfel:public volumen { protected: double volumen_w; public: void berechne_vw(double); double zeige_vw(void); wuerfel(double); }; //############################################ class quader:public wuerfel { private: double h; double b; double volumen_q; public: void berechne_vq(double,double,double); double zeige_vq(void); quader(double,double,double); }; //############################################ class flaeche { protected: double a; public: flaeche(double); }; //############################################ class dreieck:public flaeche { private: double h; double flaeche_d; public: void berechne_fd(double,double); double zeige_fd(void); dreieck(double,double); }; //############################################ class quadrat:public flaeche { protected: double flaeche_q; public: void berechne_fq(double); double zeige_fq(void); quadrat(double); }; //############################################ class rechteck:public quadrat { private: double b; double h; double flaeche_r; public: void berechne_fr(double,double,double); double zeige_fr(void); rechteck(double,double,double); };
die einzelnen klassen mit methoden
flaeche.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 #include "header.h" flaeche::flaeche(double lv_a) { a = lv_a; }
dreieck.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include "header.h" void dreieck::berechne_fd(double lv_a,double lv_h) { a = lv_a; h = lv_h; flaeche_d = (a*h)/2; } double dreieck::zeige_fd(void) { return flaeche_d; } dreieck::dreieck(double lv_a,double lv_h):flaeche(lv_a) { a = lv_a; h = lv_h; }
quadrat.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include "header.h" void quadrat::berechne_fq(double lv_a) { a = lv_a; flaeche_q = a*a; } double quadrat::zeige_fq() { return flaeche_q; } quadrat::quadrat(double lv_a):flaeche(lv_a) { a = lv_a; }
rechteck.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include "header.h" void rechteck::berechne_fr(double lv_a,double lv_b,double lv_h) { a = lv_a; b = lv_b; h = lv_h; flaeche_r = (a*b)*h; } double rechteck::zeige_fr() { return flaeche_r; } rechteck::rechteck(double lv_a,double lv_b,double lv_h):quadrat(lv_a) { a = lv_a; b = lv_b; h = lv_h; }
volumen.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 #include "header.h" volumen::volumen(double lv_a) { a = lv_a; }
pyramide.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include "header.h" void pyramide::berechne_vp(double lv_a,double lv_h) { a = lv_a; h = lv_h; volumen_p = ((a*a)*h)/3; } double pyramide::zeige_vp() { return volumen_p; } pyramide::pyramide(double lv_a,double lv_h):volumen(lv_a) { a = lv_a; h = lv_h; }
quadrat.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include "header.h" void quadrat::berechne_fq(double lv_a) { a = lv_a; flaeche_q = a*a; } double quadrat::zeige_fq() { return flaeche_q; } quadrat::quadrat(double lv_a):flaeche(lv_a) { a = lv_a; }
quader.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include "header.h" void quader::berechne_vq(double lv_a,double lv_b,double lv_h) { a = lv_a; b = lv_b; h = lv_h; volumen_q = (a*b)*h; } double quader::zeige_vq() { return volumen_q; } quader::quader(double lv_a,double lv_b,double lv_h):wuerfel(lv_a) { a = lv_a; b = lv_b; h = lv_h; }
und die main.cpp welche die klassen verwendet
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 #include <afx.h> #include <iostream.h> #include "header.h" void main() { double a,b,h; char s,w; dreieck fd(0,0); quadrat fq(0); rechteck fr(0,0,0); pyramide vp(0,0); wuerfel vw(0); quader vq(0,0,0); do { cout << "+++++++++++++++++++Menue+++++++++++++++++++++" << endl; cout << "+ Flaecheninhalt berechnen von einem... +" << endl; cout << "+ Dreieck ... 1 druecken +" << endl; cout << "+ Quadrat ... 2 druecken +" << endl; cout << "+ Rechteck ... 3 druecken +" << endl; cout << "+-------------------------------------------+" << endl; cout << "+ Volumen berechnen von einem/er... +" << endl; cout << "+ Pyramide ... 4 druecken +" << endl; cout << "+ Wuerfel ... 5 druecken +" << endl; cout << "+ Quader ... 6 druecken +" << endl; cout << "+-------------------------------------------+" << endl; cout << "+ Beenden mit einer beliebigen Taste +" << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++" << endl<<endl; cout << "Ihre Wahl: "; cin >> w; switch(w) { case '1': { cout <<"---Flaecheninhalt Berechnung eines Dreiecks--"<< endl; cout <<" Bitte die Grundlinie eingeben: "; cin >> a; cout <<" Bitte die Hoehe eingeben: "; cin >> h; fd.berechne_fd(a,h); cout <<" Der Flaecheninhalt des Dreiecks betraegt: "<< fd.zeige_fd() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } case '2': { cout <<"---Flaecheninhalt Berechnung eines Quadrats--"<< endl; cout <<" Bitte die Breite eingeben: "; cin >> a; fq.berechne_fq(a); cout <<" Der Flaecheninhalt des Quadrats betraegt: "<< fq.zeige_fq() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } case '3': { cout <<"---Flaecheninhalt Berechnung eines Rechecks--"<< endl; cout <<" Bitte die Laenge eingeben: "; cin >> a; cout <<" Bitte die Breite eingeben: "; cin >> b; cout <<" Bitte die Hoehe eingeben: "; cin >> h; fr.berechne_fr(a,b,h); cout <<" Das Volumen des Rechtecks betraegt: "<< fr.zeige_fr() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } case '4': { cout <<"------Volumen Berechnung einer Pyramide------"<< endl; cout <<" Bitte die Grundlinie eingeben: "; cin >> a; cout <<" Bitte die Hoehe eingeben: "; cin >> h; vp.berechne_vp(a,h); cout <<" Das Volumen der Pyramide betraegt: "<< vp.zeige_vp() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } case '5': { cout <<"------Volumen Berechnung eines Wuerfels------"<< endl; cout <<" Bitte die Breite eingeben: "; cin >> a; vw.berechne_vw(a); cout <<" Das Volumen des Wuerfels betraegt: "<< vw.zeige_vw() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } case '6': { cout <<"------Volumen Berechnung eines Quaders-------"<< endl; cout <<" Bitte die Laenge eingeben: "; cin >> a; cout <<" Bitte die Breite eingeben: "; cin >> b; cout <<" Bitte die Hoehe eingeben: "; cin >> h; vq.berechne_vq(a,b,h); cout <<" Das Volumen des Quaders betraegt: "<< vq.zeige_vq() << endl; cout <<"---------------------------------------------"<<endl; cout << endl; break; } default: { cout << "Bitte eine Zahl zwischen 1 und 6 eingeben! " << endl; } } cout << "Programm wiederholen? dann j oder J eingeben : "; cin >> s; cout << endl<<endl; }while(s == 'j' || s == 'J'); cout << "Vielen Dank fuer die Nutzung des Programms!"<< endl; cout << "Bei Fehlern oder Fragen koennen wir nichts dafuer:P" << endl; cout << endl<<endl; }
also wenn du fragen hast dann frag soweit ich mich noch dran erinnern kann, kann ich dir das eine oder andere erzählen aber ich hoffe dieses beispiel hilft dir vorerst weiter
MFG
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
@ivanhoe: Du hast natürlich recht, eine Vorwärtsdeklaration funktioniert hier tatsächlich nicht.
@thread: Schreib einfach die main() unter deine Klassendeklaration, damit sollte es builden. Wenn deine erste Klasse dann läuft, solltest du wie ivanhoe bereits sagte anfangen deine Klasse in einen Deklarations- und einen Implementationsteil zu zerlegen und in eigene Dateien auslagern.
Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?
@thread: Schreib einfach die main() unter deine Klassendeklaration, damit sollte es builden. Wenn deine erste Klasse dann läuft, solltest du wie ivanhoe bereits sagte anfangen deine Klasse in einen Deklarations- und einen Implementationsteil zu zerlegen und in eigene Dateien auslagern.
Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
naja ich wollte einfach nur helfen da ich ja schon bereits ein taschenrechner programmiert habe. da ich selber alles nur von code snippets gelern habe, dachte ich es wird weiterhelfen vor allem dass dermeinzer bestimmt früher oder später noch zusätzlich das kapitel vererbung durchgehen wird. naja gut die admins können es ja löschen
MFG
MFG
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Hallo,
mit dem main() unter die Klasse schreiben hat es funktioniert. Vielen Dank.
stimmt, davon, was ivanhoe gepostet hat, versteht ich nur ein bisschen, da ich so tief noch nicht in die Materie eingestiegen bin. cccpmiks Post kann ich später bestimmt mal brauchen, weil ich auch noch die Vererbung durchgehen werde, aber im Moment verwirrt es mich eher ein bisschen.
Also vielen Dank für eure Hilfe nochmal.
dermainzer
mit dem main() unter die Klasse schreiben hat es funktioniert. Vielen Dank.
Zitat
Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?
stimmt, davon, was ivanhoe gepostet hat, versteht ich nur ein bisschen, da ich so tief noch nicht in die Materie eingestiegen bin. cccpmiks Post kann ich später bestimmt mal brauchen, weil ich auch noch die Vererbung durchgehen werde, aber im Moment verwirrt es mich eher ein bisschen.
Also vielen Dank für eure Hilfe nochmal.
dermainzer
Zitat
Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?
Möchte dazu auch kurz noch etwas sagen, du hast recht, dass mein Beispiel umständlich ist, aber es war nicht als Lösung gedacht, sondern einfach dazu die Vorwärtsdeklaration etwas zu erklären. Die Lösung des konkreten Problems schrieb ich zu Anfang des Posts und erweiterte es später um das Beispiel zur Vorwärtsdeklaration.
Ich persönlich finde es nicht verkehrt wenn man in einem bestimmten Bereich ein Problem hat und dazu (neben der Lösung des Problems) auch noch Hintergundinformationen oder Tipps bekommt, wie man etwas anders (vielleicht besser) machen kann.
Nun ja, das ist aber nur meine Meinung und ich werden demnächst zwei mal überlegen, bevor ich ungefragt Informationen poste.
Ähnliche Themen
-
(X)HTML & CSS & DHTML & Javascript »-
Problem mit DIV
(15. Oktober 2004, 23:08)
-
(X)HTML & CSS & DHTML & Javascript »-
CSS - Bitte helft mir!
(23. Juli 2004, 14:07)
-
PHP »-
komisches MySQL-Prob
(14. März 2003, 15:28)
-
Foren-, Blog- und Content-Managementsysteme »-
Wahlen Hack
(4. Januar 2003, 18:31)
-
Provider & Webspace »-
[Frage] Beepworld
(4. November 2002, 14:00)



