Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit Dekonstruktor

Empfohlene Antworten

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

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.

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?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.