Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- Automatentheorie (http://www.informatikerboard.de/board/board.php?boardid=13)
----- C++Aufgabe (http://www.informatikerboard.de/board/thread.php?threadid=2215)


Geschrieben von ccc am 09.04.2015 um 23:26:

  C++Aufgabe

Hallo ich habe gerade probleme bei dieser Aufgabe:
Gegeben seien folgende (unvollständige) Klassendefinitionen. Die Klassen sollen ein Protokoll verbrauchter
elektrischer Leistung realisieren. Dabei stellt die Klasse CMeasurement die Protokolleinträge dar, die Klasse CConsumptionLog modelliert das Protokoll. Neue Einträge werden von einer Messeinrichtung durch Aufruf der Methode addEntry zum Protokoll hinzugefügt, wenn sich die gemessene Leistung ändert. Im Protokolleintrag
bezeichnet datetime den Zeitpunkt der Messung und power die gemessene Leistung. Die in einem
Protokolleintrag angegebene Leistung wird also ab dem zugehörigen Zeitpunkt solange konstant verbraucht, bis
über einen erneuten Aufruf der Methode addEntry neue Werte gemeldet werden. Der Messzeitpunkt wird in
Millisekunden seit einem fest definierten Startzeitpunkt angegeben, z.B. seit dem 1.2.2011

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:


class CMeasurement
{
private:
long m_datetime; // Messzeitpunkt in Millisekunden seit 1.2.2011 0:00
float m_power; // Gemessene Leistung in Watt
public:
//Konstruktor
CMeasurement(long datetime, float power);
CMeasurement();
void print();
};
class CConsumptionLog
{
private:
CMeasurement* m_entries; // Array mit den Messwerten
long m_maxEntries; // Größe des Array mit den Messwerten
long m_loggedEntries; // Aktuelle Anzahl von Messwerten im Array
public:
void addEntry(long datetime, float power);
void clearLogEntries();
void print();
};


















a) Mit der aktuell für CMeasurement definierten Schnittstelle können Sie neue Objekte erzeugen, aber auf die
Werte in den Objekten nicht zugreifen. Ergänzen Sie in der Klassendefinition Methoden, die Ihnen
Messzeitpunkt (m_datetime) und Leistung (m_power) als Rückgabewerte liefern. (Tragen Sie die
Ergänzungen direkt in obige Klassendefinition ein.)


Wie soll ich genau bei der a) vorgehen ?

Meine idee
long get datetime(){

return m_datetime;

}

Richtig?



Geschrieben von Karlito am 10.04.2015 um 15:47:

 

Hallo ccc,

damit eine Methode einen Wert zurückgibt, reicht es den Rückgabetypen anzugeben und den Wert dann mit return den Wert zurückzugeben. Das get wird nicht benötigt und ist an dieser Stelle sogar falsch. Sinnvoll ist, das get als Teil des Namens für den getter zu verwenden, also:
code:
1:
2:
3:
long getDatetime();


Richtig wäre also:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
class CMeasurement
{
	private:
		long m_datetime; // Messzeitpunkt in Millisekunden seit 1.2.2011 0:00
		float m_power; // Gemessene Leistung in Watt
	public:
		//Konstruktor
		CMeasurement(long datetime, float power);
		CMeasurement();
		void print();
		long getDatetime(){
			return m_datetime;
		}
		float getPower(){
			return m_power;
		}
};


Gruß,

Karlito



Geschrieben von ccc am 11.04.2015 um 13:21:

 

b) Ergänzen Sie die gegebene Klassendefinition von CConsumptionLog um einen Konstruktor, der es ermöglichen soll, optional die initiale Größe des Arrays mit Messwerten zu setzen. Die Default-Größe (keine Größe angegeben) soll 100 Elemente sein.
Ergänzen Sie in der Klassendefinition außerdem den Copy-Konstruktor sowie den Destruktor.
(Tragen Sie die Ergänzungen direkt in obige Klassendefinition ein.)

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

CConsumptionLog::CConsumptionLog(long maxEntries,){

m_maxEntries = maxEntries;

maxEntries = 100;


}



Ist der Konstruktor so richtig?



Geschrieben von eulerscheZahl am 11.04.2015 um 13:38:

 

code:
1:
2:
3:
CConsumptionLog::CConsumptionLog(long maxEntries = 100) {
    m_maxEntries = maxEntries;
}



Geschrieben von Karlito am 11.04.2015 um 13:43:

 

Wenn der Konstruktor in der Klassendefinition selbst mit angegeben wird, muss man dann den Scope nicht weg lassen? Ich glaube die Aufgabenstellung besagt, dass direkt in der Klassendefinition gearbeitet werden soll (siehe a)).
Außerdem: sollte das Array für dei Messwerte nicht gleich mit initialisiert werden?

Gruß,

Karlito



Geschrieben von ccc am 11.04.2015 um 16:49:

 

@eulersche Zahl

Muss man den default Wert immer in der runden Klammer definieren ?



Geschrieben von eulerscheZahl am 11.04.2015 um 20:26:

 

Mir ist zumindest keine andere Möglichkeit bekannt.



Geschrieben von ccc am 11.04.2015 um 22:46:

 

Was muss man den genau beim Copy Konstruktor beachten ?



Geschrieben von ccc am 11.04.2015 um 22:51:

 

So?


code:
1:
2:
3:
4:
5:
6:
7:
CConsumptionLog::CConsumptionLog(long maxEntries = 100) {
    m_maxEntries = origin.maxEntries;
}





Geschrieben von eulerscheZahl am 12.04.2015 um 08:05:

 

Nein, dem Copy Konstruktor musst du ein CConsumptionLog& übergeben.



Geschrieben von ccc am 12.04.2015 um 12:17:

 

code:
1:
2:
3:
4:
5:
6:
7:
8:

CConsumptionLog&::CConsumptionLog(long maxEntries = 100) {
    m_maxEntries = origin.maxEntries;
}




Richtig?



Geschrieben von eulerscheZahl am 12.04.2015 um 18:07:

 

code:
1:
2:
3:
CConsumptionLog::CConsumptionLog(CConsumptionLog& origin) {
    this->m_maxEntries = origin.maxEntries;
}



Geschrieben von ccc am 12.04.2015 um 18:17:

 

Wieso kommt da plötzlich ein this her ?



Geschrieben von eulerscheZahl am 12.04.2015 um 18:31:

 

this sagt einfach, dass es sich um die aktuelle Instanz der Klasse handelt. Es funktioniert zwar auch ohne, aber die Lesbarkeit wird meiner Meinung nach erhöht, da du so klar machst: die aktuelle Instanz nimmt den Wert von der anderen.

Würdest du die Klassenvariable nicht m_maxEntries nennen, sondern maxEntries, brächtest du hier zwingend ein this, um das klarzumachen:
code:
1:
2:
3:
CConsumptionLog::CConsumptionLog(long maxEntries = 100) {
    this->maxEntries = maxEntries;
}



Geschrieben von ccc am 12.04.2015 um 18:40:

 

Im destruktor einfach delete maxEntries,

einfügen ?


Forensoftware: Burning Board, entwickelt von WoltLab GmbH