eryx Geschrieben 20. Juni 2009 Geschrieben 20. Juni 2009 Hallo erstmal So ich erklär ma kurz die aufgabenstellung dann schilder ich mein Problemchen Alsoooo ^^ Habe 2 Klassen: Handy und Charger mit grundlegenden metoden. der dekonstruktor soll am ende den zustand des handy objektes ausgeben, da liegt auch mein problem. Denn dieser wird 2 mal hintereinander aufgerufen oO Also 1 mal wenn ich die methode nokia_charger.chargeAccu(nokia); und wenn dass eigentliche handy objekt zerstört wird. Kann ich den 1. aufruf irgendwie unterbinden bzw in den dekonstruktor ne if condition reinhaun damit der den status nur ausgibt wenn er dass 2. ma aufgerufen wird? naja okay ich post ma mein code handy.h #include <time.h> using namespace std; void wait(double seconds); class handy{ private: string name; int txPower; // in mW float accuCharge; // in mAh int accuCapacity; // in mAh int accuVoltage; //{read only} time_t ConnectionStart,ConnectionEnd; int ConnectionDuration, timeTalked; bool NetStatus; public: handy(string,int,int); handy(const handy&); ~handy(); void moreTxPower(); void lessTxPower(); void connect(); void disconnect(); float accuState(); // Zugriffsmethoden int getAccuCapacity(); float getAccuCharge(); int getAccuVoltage(); int getTxPower(); }; charger.h #include <string> #include "handy.h" void wait(double seconds); using namespace std; class charger{ private: string name; float accumulatedChargingTime; int chargingCurrent; // Ladestrom public: charger(string,int); charger(const charger&); ~charger(); void chargeAccu(handy); void powerOn(); void powerOff(); //Zufriffsmethode }; handy.cpp #include "handy.h" #include "charger.h" handy::handy(string aName, int aTxPower, int aAccuCapacity){ timeTalked=0; accuVoltage =8; name = aName; txPower= aTxPower; accuCapacity = aAccuCapacity; accuCharge = aAccuCapacity; cout << "ON\n"; } handy::handy(const handy &handyToCopy){ // Copy constructor cout << "Copy\n"; accuCapacity = handyToCopy.accuCapacity; accuVoltage = handyToCopy.accuVoltage; accuCharge = handyToCopy.accuCharge; txPower = handyToCopy.txPower; } handy::~handy(){ cout << "OFF\n"; cout << "\n\n\n\n"; cout << "Daten für Handy: " << name << endl; cout << "Dauer aller Gespräche: " << timeTalked*15 << " Minuten" << endl; cout << "Ladestatus: " << accuState() << " %" << " (" << accuCharge << " mA)" << endl; } void handy::moreTxPower(){ if (txPower >=100 && txPower <2000) { txPower += 100; cout << txPower << endl; } else { cout << "Unzulässige Operation\n"; } } void handy::lessTxPower(){ if (txPower >=100 && txPower <2000) { txPower -= 100; cout << txPower << endl; } else { cout << "Unzulässige Operation\n"; } } void handy::connect(){ NetStatus = true; cout << "CONNECTED\n"; ConnectionStart = time(NULL); cout << "Gesprächszähler gestartet...\n"; } void handy::disconnect(){ NetStatus = false; cout << "DISCONNECTED\n"; ConnectionEnd = time(NULL); ConnectionDuration = ConnectionEnd - ConnectionStart; cout << "Gesprächsdauer: " << ConnectionDuration*15 << " Minuten" << endl; accuCharge = accuCharge - ((txPower/accuVoltage)*ConnectionDuration); timeTalked +=ConnectionDuration; } float handy::accuState(){ float state; int x = accuCapacity/100; state = (accuCharge/x) + 0,05; return state; } int handy::getAccuCapacity(){ return accuCapacity; } float handy::getAccuCharge(){ return accuCharge; } int handy::getAccuVoltage(){ return accuVoltage; } int handy::getTxPower(){ return txPower; } charger.cpp #include "charger.h" #include "handy.h" void wait(double seconds); charger::charger(string aName, int newChargingCurrent){ name = aName; chargingCurrent=newChargingCurrent; } charger::charger(const charger &chargerToCopy){ } charger::~charger(){ } void charger::chargeAccu(handy aNew){ int c; c = aNew.getAccuCapacity() - aNew.getAccuCharge(); accumulatedChargingTime=(aNew.getAccuVoltage()*c)/aNew.getTxPower(); cout << "Ladedauer: " << accumulatedChargingTime*15 << " Minuten\n"; wait(accumulatedChargingTime); } void charger::powerOn(){ cout << "Beginne mit Ladevorgang...\n"; } void charger::powerOff(){ cout << "Ladevorgang abgeschlossen!\n"; } main.cpp #include "handy.h" #include "charger.h" #include <string> using namespace std; void wait(double seconds); int main(){ setlocale(LC_ALL,"German_Germany.1252"); // Objekte erzeugen handy nokia("nokia3210",900, 1250); charger nokia_charger("nokia3210",125); // Test Programmablauf nokia.lessTxPower(); nokia.moreTxPower(); nokia.moreTxPower(); nokia.connect(); wait(4); nokia.disconnect(); // Ladevorgang nokia_charger.powerOn(); nokia_charger.chargeAccu(nokia); nokia_charger.powerOff(); } Anmerkung: void wait(double seconds); is ne .lib die einfach ne sleep funktion beinhaltet also wait(4) sind dann 4 sec. so falls jemand soviel zeit hat das ma zu lesen, und eventuell verbesserungsvorschläge, lösungsansätze für mein prob hat wäre dass sehr nett greetz eryx Zitieren
Klotzkopp Geschrieben 20. Juni 2009 Geschrieben 20. Juni 2009 Das Ding heißt Destruktor, nicht Dekonstruktor. Und das Problem ist, dass der Parameter von charger::chargeAccu ein handy ist. Das ist "Call-by-value", da wird eine Kopie des handy-Objekts erzeugt, und diese Kopie wird natürlich auch wieder zerstört. Das bedeutet auch, dass charger::chargeAccu den Parameter in keiner Weise verändern kann, weil die Methode nur mit einer Kopie arbeitet. In deinem aktuellen Code wird das handy zwar nicht verändert, sinnvoll wäre es aber schon. Wenn es also irgendwann mal ein handy::setAccuCapacity geben sollte, wirst du bemerken, dass es in charger::chargeAccu nichts bewirkt. Die Lösung ist, den Parameter hier als Referenz zu übergeben. Zitieren
eryx Geschrieben 20. Juni 2009 Autor Geschrieben 20. Juni 2009 Hallo klotzkopp danke für deine antwort welchen parameter meinst du ? nokia_charger.chargeAccu(nokia); hier statt dem objekt also ne referenz ? mh dann brauch ich den copy konstruktor auch nicht mehr oda bin ich da auf dem holzweg? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.