Klasse -Elektro- mit Fehlern "HIIILLFE"
-
Hallo Leute,
ich muss ein Programm schreiben wo eine Basisklasse ist, die ich auch Basis genannt habe. Weiterhin habe ich 3 weitere KLassen.
Computer, Laptop, und PDA. In der Basisklasse sind alle Eigenschaften die jeder auch hat. In den weiteren Klassen sind nur die jeweiligen Eigenschaften des Gerätes zu finden. Nun soll man durch eine Auswahl auf die jeweilige Klasse zugreifen können. Ich habe das so versucht.. aber leider hab ich 14 Fehler...-------------------------------------------------------------------------------
// basis.h: Schnittstelle für die Klasse basis. // ////////////////////////////////////////////////////////////////////// #include <string> #include <iostream> using namespace std; class basis { public: basis(); ~basis(); float getBild(); void setBild(float bi); float getArbeitsp(); void setArbeitsp(float arb); float getFestplatte(); void setFestplatte(float fest); float getGeschw(); void setGeschw(float gesch); void display(void); protected: float bild; float arbeitsp; float festplatte; float geschw; //weitere Funktionen (display) }; /* Klasse Computer */ class computer : public basis { public: computer(); ~computer(); int getCdge(); void setCdge(int cd); int getDvdge(); void setDvdge(int dvd); int getGraka(); void setGraka(int grafik); void display(void); private: int cdge; int dvdge; int graka; }; /* Klasse Laptop */ class laptop :public basis { public: laptop(); ~laptop(); string getSlot(); void setSlot(string sdslot); float getW(); void setW(float wlan); void display(void); private: string slot; float w; }; /* Klasse PDA */ class pda: public basis { public: pda(); ~pda(); string getBlue(); void setBlue(string bl); int getGpsk(); void setGpsk(int gps); void display(void); private: string blue; int gpsk; }; ------------------------------------------------------------------------------ // basis.cpp: Implementierung der Klasse basis. // ////////////////////////////////////////////////////////////////////// #include "basis.h" ////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion ////////////////////////////////////////////////////////////////////// basis::basis() { cout <<"Ich baue ein Objekt der Klasse Basis auf" <<endl; } basis::~basis() { cout <<"Ich zerstöre ein Objekt der Klasse Basis " <<endl; } float basis::getBild() { return bild; } void basis::setBild(float bi) { bild=bi; } float basis::getArbeitsp() { return arbeitsp; } void basis::setArbeitsp(float arb) { arbeitsp=arb; } float basis::getFestplatte() { return festplatte; } void basis::setFestplatte(float fest) { festplatte=fest; } float basis::getGeschw() { return geschw; } void basis::setGeschw(float gesch) { geschw=gesch; } void basis::display() { cout <<" Die Bildschirmgroese betraegt " <<bild <<endl; cout <<" Der Arbeitsspeicher betraegt " <<arbeitsp<<endl; cout <<" Die Festplatten groeße betraegt " <<festplatte <<endl; } //---------------------Klasse Computer------------------ computer::computer() { cout <<"baue ein Objekt von Computer auf" <<endl; } computer::~computer() { cout <<"Zerstöre Objekt von COmputer" <<endl; } int computer::getCdge() { return cdge; } void computer::setCdge(int cd) { cdge=cd; } int computer::getDvdge() { return dvdge; } void computer::setDvdge(int dvd) { dvdge=dvd; } int computer::getGraka() { return graka; } void computer::setGraka(int grafik) { graka=grafik; } void computer::display() { cout <<" Die Bildschirmgroese betraegt " <<bild <<endl; cout <<" Der Arbeitsspeicher betraegt " <<arbeitsp <<endl; cout <<" Die Festplatten groeße betraegt " <<festplatte <<endl; cout <<" Die Cd-Geschwindigkeit betraegt:" <<cdge <<endl; cout <<" Der DVD-Geschwindigkeit betraegt:" <<dvdge <<endl; cout <<" Der Grafigkartenspeicher betraegt: " <<graka <<endl; } //---------------------------Klasse Laptop--------------- laptop::laptop() { cout <<"Baue ein Objekt von Laptop auf" <<endl; } laptop::~laptop() { cout <<"Zerstöre Objekt von Laptop" <<endl; } string laptop::getSlot() { return slot; } void laptop::setSlot(string sdslot) { slot=sdslot; } float laptop::getW() { return w; } void laptop::setW(float wlan) { w=wlan; } void laptop::display() { cout <<" Die Bildschirmgroese betraegt " <<bild <<endl; cout <<" Der Arbeitsspeicher betraegt " <<arbeitsp <<endl; cout <<" Die Festplatten groeße betraegt " <<festplatte <<endl; cout <<" Ihr Laptop hat ein Sdslot:" <<slot <<endl; cout <<" Ihr Laptop hat ein Wlan:" <<w<<endl; } //--------------------Klasse PDA--------------------- pda::pda() { cout <<"Baue ein Objekt von Laptop auf" <<endl; } pda::~pda() { cout <<"Zerstöre Objekt von PDA" <<endl; } string pda::getBlue() { return blue; } void pda::setBlue(string bl) { blue=bl; } int pda::getGpsk() { return gpsk; } void pda::setGpsk(int gps) { gpsk=gps; } void pda::display() { cout <<" Die Bildschirmgroese betraegt " <<bild <<endl; cout <<" Der Arbeitsspeicher betraegt " <<arbeitsp <<endl; cout <<" Die Festplatten groeße betraegt " <<festplatte <<endl; cout <<" Ihr Pda hat eine Bluetooth:" <<blue <<endl; cout <<" Ihr Pda hat insgesamt GPS-Kanaele:" <<gpsk <<endl; } ------------------------------------------------------------------------------ #include "basis.h" #include <iostream> #include <string> using namespace std; int main() { float bi, arb, fest, gesch; int auswahl, cd, dvd, grafik; string a, b, c, l, neustart; basis *zeiger; cout <<"*********Auswahl zwischen Basis Computer Laptop und PDA********\n" <<endl; cout <<"Bitte druecken sie fuer Basis (1)" <<endl; cout <<"Bitte druecken sie fuer Computer (2)" <<endl; cout <<"Bitte druecken sie fuer Laptop (3)" <<endl; cout <<"Bitte druecken sie fuer PDA (4)" <<endl; cin >>auswahl; switch(auswahl) { case 1: zeiger=new basis;break; case 2: zeiger=new computer;break; case 3: zeiger=new laptop;break; case 4: zeiger=new pda; break; default: zeiger=new basis;break; } do{ cout<<"\n\n Geben Sie die Bildschirmgroesse ein (Zoll) 5-21 :"; cin>>bi; }while(bi < 5 || bi > 21); do{ cout<<"Geben Sie das Arbeitsspeicher an (MB) 10 - 1024:"; cin>>arb; }while(arb < 10 || arb > 1024); do{ cout<<"Geben Sie die Festplattengroeße ein (GB) 1-1000:"; cin>>fest; }while(fest < 1 || fest > 1000); zeiger->setBild(bi); //bild einlesen zeiger->setArbeitsp(arb); //Arbeitsspeicher einlesen zeiger->setGeschw(gesch); //CPU-gesch einlesen if(auswahl=2) { do{ cout <<"Bitte geben sie Cd-Gesch ein" <<endl; cin>>cd; cout <<"Bitte geben sie die DVD-Gesch ein" <<endl; cin>>dvd; cout <<"Bitte geben sie die GrakaSpeicher ein" <<endl; cin>>grafik; zeiger->setCd(cd); zeiger->setDvdge(dvd); zeiger->setGraka(grafik); } } if(auswahl=3) { do{ cout <<"Bitte geben sie die Anzahl der SD-Slots an" <<endl; cin>>sdslot; cout <<"Bitte die Wlan geschwindigkeit ein: " <<endl; cin>>wlan; zeiger->setSlot(sdslot): zeiger->setW(wlan); } } if(auswahl=4) { do{ cout <<"Hat der Pda ein Bluetooth schnittstelle:" <<endl; cin>>bl; cout <<"Wie viele GPS-Kanäle hat ihr PDA: " <<endl; cin>>gps; zeiger->setBlue(bl); zeiger->setGpsk(gps); } } cout<<"Programm wiederholen? Beliebige Taste betaetigen, sonst Nein ( N ) : "; cin >> neustart; //eingabe der neustart variable if(neustart == "N") //weiter falls N eingegeben wurde { //leer } else // bereich der bei neustart = n übersprungen wird { system("cls"); //Bildschirm löschen main(); //Programm neustart } return 0; }-----------------------------------------------------------------------------
Wäre echt cool wenn mir jemand weiterhelfen könnte. Hab in zwei wochen meine Prüfung und ich komm mit den Zeigern gar nicht klar[cpp]
-
a) Wo sind die Fehlermeldungen?
b) Benutz bei solchen Codemengen die Code-Tags, sonst macht sich niemand die Mühe, dass durchzusehen.
-
Hi!
Das Design is ja ziemlich fieß! :-|
Und die Fehlermeldung würd mich auch interessieren!
grüße
-
--------------------Konfiguration: elektro - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
I:\Klasse Elektro\Elektro\main.cpp(71) : error C2039: 'setCd' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(72) : error C2039: 'setDvdge' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(73) : error C2039: 'setGraka' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(75) : error C2059: Syntaxfehler : '}'
I:\Klasse Elektro\Elektro\main.cpp(81) : error C2065: 'sdslot' : nichtdeklarierter Bezeichner
I:\Klasse Elektro\Elektro\main.cpp(84) : error C2065: 'wlan' : nichtdeklarierter Bezeichner
I:\Klasse Elektro\Elektro\main.cpp(86) : error C2039: 'setSlot' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(86) : error C2143: Syntaxfehler : Fehlendes ';' vor ':'
I:\Klasse Elektro\Elektro\main.cpp(92) : error C2059: Syntaxfehler : '}'
I:\Klasse Elektro\Elektro\main.cpp(99) : error C2065: 'bl' : nichtdeklarierter Bezeichner
I:\Klasse Elektro\Elektro\main.cpp(102) : error C2065: 'gps' : nichtdeklarierter Bezeichner
I:\Klasse Elektro\Elektro\main.cpp(104) : error C2039: 'setBlue' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(105) : error C2039: 'setGpsk' : Ist kein Element von 'basis'
i:\klasse elektro\elektro\basis.h(9) : Siehe Deklaration von 'basis'
I:\Klasse Elektro\Elektro\main.cpp(107) : error C2059: Syntaxfehler : '}'
Fehler beim Ausführen von cl.exe.elektro.exe - 14 Fehler, 0 Warnung(en)
-
Auf Computer casten?
-
was soll das heissen ?
-
Du hast ja auch einen Zeiger vom Typ "basis*", der kennt nur die Methoden der Basisklasse. Und dem Compiler ist es da auch egal, auf was dieser Zeiger verweist.
Wenn du die Methoden der abgeleiteten Klassen verwenden willst, mußt du den Zeiger entsprechend casten (dynamic_cast<>, notfalls auch static_cast<>) - aber sowas deutet normalerweise auf ein falsches Design hin.
-
bin ein noob , verstehe nur bahnhof und viele züge .. !
könnt ihr mir das evtl. etwas detalierter erklären.. ?!
sonst verstehe ich gar nix LOL
-
Hi!
Wenn du einen Zeiger von der Basisklasse auf eine Instanz einer abgeleiteten Klasse zeigen lässt, dann is das zwar möglich aber der Compiler sieht trotzdem nur die Methoden der Basisklasse und nicht die der abgeleiteten Klasse auf welche gezeigt wird.
grüße
-
was kann ich jetzt gegen meine fehler machen ?
ich habe khain plan welche befehle ich noch benutzen kann, soll etc. muss... !
vielleicht könntet ihr mit am programm direkt weiterhelfen...
-
Lies mal schnell das:
http://de.wikibooks.org/wiki/C++-Programmierung:_Operatoren#dynamic_cast
btw:
Wenn du für ne Prüfung lernst, solltest du nicht fragen: "Wie mach ich jetzt, dass es geht?", sondern eher: "Wo kann ich mich belesen, warum ich das machen muss"...
-
MHH bei mir sind jetzt ganz viele
confused:
BAHNHOF!sorry ich versuche das zu vestehen , aber nix verstehen ...
-
was soll mir diese umwandlung den bringen ?
meine fehler sind doch das der zeiger nicht auf die anderen klassen verweisst
und nicht auf die elemente zugreifen kann.. wenn ich zeiger-> eingebe sollte alle elemente der klassen auftauchen.. aber hier sind nur die von der basis klasse... nun meine frage.. wo ist mein fehler das nur die klasse basis auftaucht..
-
Du hast den Zeiger definiert, daß er auf Objekte der Basisklasse zeigen soll - also geht der Compiler zunächst davon aus, daß genau das der Fall ist. Wie dir schon alle in diesem Thread geantwortet haben, mußt du ihm klarmachen, daß du an der Stelle ein Objekt der abgeleiteten Klasse hast:
basis* zeiger = new PC; ... dynamic_cast<PC*>(zeiger)->setCD(cd);(und bevor du zehnmal die selbe Frage stellst, denk erstmal über die Antworten nach, die du bekommen hast)
-
Okay.
Beispiel Klasse Basis und Klasse Computer:
In der Klasse Computer hast du die Methode setDVD() und alle Methoden der Basisklasse Basis. Die Klasse Basis wiederum kennt die Methode setDVD() nicht.
Ist ja logisch, weil du Computer von Basis abgeleitet hast.
Deine Zeiger, die du verwendest sind vom Typ Basis! Also gibt es bei diesem Zeiger nur die Methoden der Klasse Basis. Die Methode setDVD() ist nicht in der Klasse Basis vorhanden, deswegen kommen diese Fehlermeldungen. Dass bedeutet, du musst deinem Compiler irgendwie deutlich machen, dass dein Zeiger auch auf Methoden deiner Klasse Computer zugreifen darf.
Und dafür gibt es die Casts. Damit wandelst du deinen Zeiger, der bisher auf einen Typ Basis zeigt in einen Zeiger um, der auf den Typ Computer zeigt. Und da dieser Typ die Methode setDVD() kennt, kannst du die Methode dann auch benutzen.Alles klar?
-
Ich komm voll nicht klar..
hier nochmals meine problemstellung aufgezeichnet ...
sollte man in diesem fall einen zeiger benutzen , oder mehrere ?
ftp://robtschick.homeftp.net/Problemstellung.JPG
-
HUNDEMISST ICH KOMM NICHT WEITER::::::::: MIT DEM MISST HIER :::
-
Flipper schrieb:
sollte man in diesem fall einen zeiger benutzen , oder mehrere ?
Gar keinen - solange du die Objekte nur einlesen und anzeigen sollst, kannst du auch Stack-Objekte vom richtigen Typ verwenden.
-
Flipper schrieb:
HUNDEMISST ICH KOMM NICHT WEITER::::::::: MIT DEM MISST HIER :::Aufpassen: C++ ist case-sensitive

-
ja einen müssen wir ja benutzen... mit objekten weiß ich ja wies geht.. aber diese blöden zeiger nicht... !