Zum Inhalt springen

Problem mit Dekonstruktor


eryx

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...