Habe probleme bei überladenen Operatoren ++ und -- und cout << *actualDevice

SerkanDA

Grünschnabel
KANN MIR BITTE JEMEND BEI DIESER AUFGABE HELFEN?
HABE ALLES GESCHAFFT BIS AUF überladenen Operatoren ++ und --
und weis leider nicht wie ich die ausgabe cout << *actualDevice hinbekomme.



Problemstellung:
Rechner übernehmen immer mehr Steuerungsaufgaben im Haushalt; sie steuern die Waschmaschine, den Herd oder die Heizung. Besonders weit entwickelt führt das zum sogenannten "Smart House". Realisieren Sie eine Fernbedienung für ein solches Smart House; simulieren Sie dabei die einzelnen Funktionen ausgewählter Geräte.
Technische Hinweise: Entwerfen Sie eine Vererbungshierarchie bestehend aus einer Basisklasse GeneralDevice und drei abgeleiteten Klassen (spezielle Geräte: Coffeemachine, Radio, Heating). Sehen Sie neben Konstruktor und Destruktor die überladenen Operatoren ++ und -- zum Inkrementieren und Dekrementieren eines speziellen Attributes (int numberOfCups bei Kaffeemaschine, double volume bei Radio, float temperature bei Heizung) jedes Geräts vor. Außerdem soll eine einfache Ausgabe des Zustandes des jeweiligen Objektes (deviceName sowie numberOfCups, volume oder temperature) unter Verwendung der Anweisung cout << *actualDevice; möglich sein. Das Zusammenspiel von Konstruktoren und Destruktoren der Basisklasse und der Subklassen soll durch sinnvoll gewählte Ausgaben bei ihrem jeweiligen Aufruf verdeutlicht werden.


SmartHouse
Remote Control
+ laut/warm/...
- leise/kalt/...
1 Tchibo KM 3
2 Radio WZ
3 Radio Küche
4 Heizung OG
5 Heizung EG
? Übersicht
0 aus


Entwerfen Sie ein Anwendungsprogramm, das im Dialog die Tasten der Fernbedienung abfragt und die entsprechende Aktion auslöst (= polymorpher Methodenaufruf des betreffenden Objekts). Verwenden Sie dabei eine Zeigervariable actualDevice, die aus einem Array von Gerätezeigern versorgt wird.

Sollte etwa so aussehen
Code:
vector<GeneralDevice *>geraete(5);

Für die Ausgabe
Code:
for(int i=0;i<5;i++)
{
  cout<<*geraete[i];    //Eine Printmethode (Rein Virtuell) in der Basisklasse soll vorhanden
                                //und jeweil auch print methoden in den abgeleiteten Klassen.

}

danach habe ich << operator benutzt.
Code:
ostream& operator<<(ostream& output,const GeneralDevice & device )
{
      output<<device.print();   //Dies klappt bei mir nicht 
}
 
Ich weiß ja nicht was fu vor hast...
Code:
ostream& operator<<(ostream& output,const GeneralDevice & device )
{
output<<device.print(); //Dies klappt bei mir nicht
}

Was gibt denn die Methode print() zurück?
Code:
ostream& operator<<(ostream& output,const GeneralDevice & device )
{
              device.print(); //Dies sollte viell klappen
              return cout;
}

Gruß

RedWing
 
hi danke für eure antwort aber ich habe vergessen return output hinzuschreiben.
Aber das war nicht das eigentliche Problem.
Die Methode print() sollte den aktuellen zustand den Geraetes zurück geben.
zum Beispiel:

int Coffeemachine :: print()
{
return numperOfCups;
}

und dies selbe auch für die jeweils anderen zwei abgeleiteten Klassen.


Danke für eure Hilfe im voraus
 
Kachelator hat gesagt.:
Was tut ihr da? Ihr müsst in jedem Fall doch den übergebenen Stream zurückgeben, also output.
Upsala hatte mich im Eifer des Gefechtes verschrieben :-(

hi danke für eure antwort aber ich habe vergessen return output hinzuschreiben.
Aber das war nicht das eigentliche Problem.
Die Methode print() sollte den aktuellen zustand den Geraetes zurück geben.
zum Beispiel:

int Coffeemachine :: print()
{
return numperOfCups;
}

und dies selbe auch für die jeweils anderen zwei abgeleiteten Klassen.


Danke für eure Hilfe im voraus

Ist dein Problem jetzt gelöst?

Gruß

RedWing
 
nein leider habe ich das Problem noch nicht lösen können

//<< operator in der BASISKLASSE

ostream& operator<<(ostream& output,const GeneralDevice & device )
{
output<<device.print(); //Dies klappt bei mir nicht
return output;
}


habe drei verschiedene rückgabetypen int für numberOfCups, double für volume und
float für temperature.und jeweils drei print() methoden in den abgeleiteten klassen.
wie soll ich den rückgabetypen definieren um eine korrekte ausgabe zu erzielen?
Ein vorschlag war einen string als rückgabetyp zu defienieren und die jeweiligen
typen dann in einen string umzuwandeln.
Hat vielleicht einer von euch einen anderen vorschlag.Weil das mit dem string krieg
ich nicht auf die Reihe.
Danke im voraus für eure hilfe.
 
Hallo,

das mit den strings könntest du so machen:

Code:
#include <iostream>
#include <sstream>

using namespace std;


class GeneralDevice{

        public:
                virtual const string& print() const = 0;
};

class SpecialDeviceA : public  GeneralDevice{
        private:
                int numberOfCups;
        public:
                SpecialDeviceA(int cups){
                        numberOfCups = cups;
                }

                const string& print() const{
                        static string ret;
                        ostringstream os;
                        os << numberOfCups;
                        return  (ret = os.str());
                }

};

class SpecialDeviceB : public  GeneralDevice{
        private:
                double numberOfCups;
        public:
                SpecialDeviceB(double cups){
                        numberOfCups = cups;
                }

                const string& print() const{
                        static string ret;
                        ostringstream os;
                        os << numberOfCups;
                        return (ret = os.str());
                }

};

ostream& operator<<(ostream& cout, GeneralDevice* dev){
        cout << dev->print();
        return cout;
}

int main(){

        GeneralDevice* devA = new SpecialDeviceA(5);
        GeneralDevice* devB= new SpecialDeviceB(5.3);
        cout << devA << endl;
        cout << devB << endl;
        delete devA;
        delete devB;
}

Eine andre Variante fällt mir momentan nicht ein.


Gruß

RedWing
 
danke für deine Lösung.
ich werd es dann mal versuchen. Gib dann bescheid ob es geklappt hat.

Gruß

Serkan
 
Zurück