Klasse -Elektro- mit Fehlern "HIIILLFE"



  • 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...

    ftp://robtschick.homeftp.net/Elektro.zip



  • 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... !



  • basis.h

    class basis
    {
    
    public:
    	basis();
    	~basis();
    	void setCPUSpeed(int _speed);
    
    private:
    	int CPUspeed;
    
    };
    

    basis.cpp

    #include "basis.h"
    
    basis::basis()
    {
    }
    
    basis::~basis()
    {
    }
    
    void basis::setCPUSpeed(int _speed)
    {
    	CPUspeed = _speed;
    }
    

    computer.h

    #include "basis.h"
    
    class computer : public basis
    {
    public:
    	computer();
    	~computer();
    	void setDVDSpeed(int _speed);
    
    private:
    	int DVDspeed;
    };
    

    computer.cpp

    #include "computer.h"
    
    computer::computer()
    {
    }
    
    computer::~computer()
    {
    }
    
    void computer::setDVDSpeed(int _speed)
    {
    	DVDspeed = _speed;
    }
    

    anwendung.cpp

    #include "computer.h"
    
    int main(int argc, char* argv[])
    {
    
    	// geht
    	basis* basisZeiger = new basis();
    	basisZeiger->setCPUSpeed(1000);
    
    	basisZeiger = new computer();
    
    	// geht nicht, weil basisZeiger vom Typ basis ist und die Methode setDVDSpeed() nicht kennt!!!
    	//
    	// basisZeiger->setDVDSpeed(48);
    
    	// geht, weil wir den Zeiger von basis-Objekten auf computer-Objekte gecastet haben
    	static_cast<computer*>(basisZeiger)->setDVDSpeed(48);
    
    	return 0;
    }
    

    Dynamic Casts sind wohl besser, aber das hab ich jetzt auf die Schnelle nicht realisiert. Kann ja mal jemand so abändern.



  • Wie oft möchtest Du es eigentlich noch erklärt bekommen?

    Basis *p = new PC;
    
    // So machst Du's:
    p->setCD(cd); // geht nicht weil p ein Basis* ist, und die Klasse Basis kein setCD kennt
    
    // So muss es (wenn überhaupt, denn dynamic_casts sind vermeidbar):
    dymanic_cast<PC*>(p)->setCD(cd); // geht, weil man dem Compiler sagt "ich bin mir aber sicher, einen PC zu haben"
    

    EDIT: Lahm 🙄


Anmelden zum Antworten