Datenstruktur in Klasse (C++)

cpp_rookie

Grünschnabel
Hallo,

ich soll den folgenden Code der derzeit noch als Datenstruktur deklariert ist, in eine Klasse "umwandeln":


#include <iostream>
using namespace std;

struct Time
{
int hour;
int minute;
int second;

};

void print24hFormat( Time );
void print12hFormat( Time );

int main()
{
struct Time begin;
begin.hour = 18;
begin.minute = 05;
begin.second = 00;

cout << "Abendessen ist um ";
print24hFormat( begin );
cout << " im 0-24h Format,\nbzw. ";
print12hFormat( begin );
cout << " im 0-12h Format.\n";
}
void print24hFormat ( Time begin )
{
cout << ( begin.hour < 10 ? "0" : "" ) << begin.hour << ":"
<< ( begin.minute < 10 ? "0" : "" ) << begin.minute << ":"
<< ( begin.second < 10 ? "0" : "" ) << begin.second << endl;
}
void print12hFormat ( Time begin )
{
cout << (( begin.hour==0 || begin.hour==12 ) ? 12 : begin.hour % 12 )
<< ":" << ( begin.minute < 10 ? "0" : "" ) << begin.minute
<< ":" << ( begin.second < 10 ? "0" : "" ) << begin.second
<< ( begin.hour < 12 ? " AM" : " PM" ) << endl;
}

Ich komm aber nicht so wirklich voran.

Derzeit hab ich meine Header datei verfasst:
#pragma once

class time
{
private:
int hour, minute, second;

public:
time(void);
~time(void);

void print24hFormat();
void print12hFormat();
};

Stimmt das schonmal ?

Nun komm ich auch schon nicht mehr weiter, müsste ja nun in der cpp datei meine Methoden implementieren oder?

Quasi
#include "time.h"
#include <iostream>

time:: print24hFormat()
{
code...
}
time:: print12hFormat()
{
code...
}

?

Funktioniert aber mal gar nicht irgendwie..

Kann mir da jemand auf die Schnelle auf die Sprünge helfen? :rolleyes:

Gruß
rookie
 
Hi,
das ist soweit schon ganz gut.
Du musst noch den Konstruktor und Destruktor
in der cpp Datei implementieren.

Benny
 
Okay,

also noch:
time::time()
{

}

time::~time()
{

}

hinzufügen in die cpp.

Nur weiß ich nun nicht was ich wo reinschreiben muss.
Z.b. was in den Code vom Konstruktor/Destruktor kommt, damit das so läuft, wie es mit dem obigen Code ohne Klasse läuft.
 
In deinem Konstruktor kannst du die Werte
von hour, minute und second z.B auf 0 setzen.

Dann solltest du noch ein paar Funktionen zum ändern
der Werte schreiben wie :
Code:
int time::getHout(){
return hour;
}
void time::setHour( int h ){
hour = h;
}


Wie du siehst kann man auf die Membervariablen
direkt zugreifen. Der Code mit der struct ist soweit
bis auf die Zugriffe okay.

EDIT:
Tip: du kannst auch noch ein Konstruktor schreiben dem alle
3 Werte übergeben werden ;)
 
Wow, nach mind. 5 Tutorials, deiner Hilfe und viel rumprobieren bekomm ich nun fast das raus, was rauskommen soll ;-)

Allerdings weiß ich nicht wie ich die festgelegten Werte aufrufen kann.
Also mit:

int main()
{
time elapsed;
elapsed.setTime(14,4,3);
elapsed.print24hFormat();
elapsed.print12hFormat();
}

(Wobei hier elapsed nicht das heißt was es eigentlich ausdrückt, aber ich war bisher zu faul es zu ändern und anzupassen.)
klappt es, jedenfalls gibt er mir dort nur die Zeit wie in der Zeile
elapsed.setTime(14,4,3);
steht aus. Ich würde es aber gerne so ausgeben, wie ich es ganz oben im Konstruktor definiert habe.

time::time()
{
int hour=18;
int minute=05;
int second=00;

}
Ich kann aber diese Werte nicht aufrufen, jedenfalls mit elapsed.setTime(hour,minute,second); geht es nicht oder (h,m,s), wie ich es innerhalb setTime festgelegt habe. Fehlermeldung ist, dass "hour" etc. nicht deklariert ist ... !

void time::setTime(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}



Ich krieg bald e kind, wenn das net bald läuft. :)

Gruß
rookie
 
Zuletzt bearbeitet:
Hab noch 1 Frage.
Ich würde gerne die errechnete sec Zeit von getTimeInSeconds an setS übergeben. So wie es da ist, geht es nicht, ist nicht deklariert nach Fehlermeldung. Da ist wohl Lokale Variable das Stichwort?!
Wie würde das denn funktionieren?


void time::getTimeInSeconds(int sec)
{
sec = hour * 3600 + minute * 60 + second;
cout << "Alles umgerechnet in Sekunden: " << sec << endl << endl;

}

void time::setS(int midnightTime)
{
midnightTime = sec;
cout << "Zeit seit Mitternacht" << midnightTime << endl;
}

Danke schonmal.
rookie
 
Also:
1. Du solltest deinen code in CODE und nicht in QUOTE Blöske schreiben ;)

2. get Funktionen haben einen Rückgabewert und seltener einen Übergabeparameter. Wenn die funktion nur die Zeit in Sekunden ausgeben soll würde ich sie printTimeInSeconds nenen.

3. Wenn du die Sekunden nun an deine setS funktion übergeben willst kannst du diese einfach aufrufen. Würde aber an dieser stelle zu falschen Werten führen. Da die Sekunden in deiner Timeklasse ja nur Wertte zwischen 0 und 59 annehmen dürfen. Für die Zeit in Sekunden kannst du dir ja noch eine zimeInSeconds Variable anlegen.

4. In deinem Konstruktor legst du lokale Variablen an denen du deine Werte zuweist. Die Membervariablen bleiben unverändert. Das mit den Konstruktoren und dem Initialisieren der Werte könnte man so machen:

Code:
time::time(){
hour = 0;
minute = 0;
seconds = 0;
}

time::time( int h, int m, int s ){
hour = h;
minute = m;
seconds = s;
}
Der Prototyp vom 2ten Konstruktor muss dann natürlich noch in der .h eigetragen werden.

Die Benutzung der beiden Konstruktoren würde dann so aussehn :
Code:
int main(){
time time1(); // hier wird der time() aufgerufen Klammern können auch fehlen
time time2( 15, 30, 28 );  
//blabla ... 
 }


5 Was soll die setS Funktion machen ?

Benny
 
Oha, danke schonmal..

Zu setS:
Ergänzen Sie die Klasse Time, um die Methode getTimeInSeconds und die Methode setS, die die seit Mitternacht verstrichene Zeit in Sekunden übergeben bekommt, daraus die aktuelle Zeit errechnet und in den Membervariablen ablegt.

Sry, bin grad in Eile.
Gruß
 
Dann solltest du das auch tun ;)
Tip: Die Operation Modulo % gibt dir bei Division den Rest zurück
Bsp:
Code:
int i = 64%60;
// 60 ist jetzt 4..

Das sollte dir bei der Berechnung der Zeit Helfen.
 
Zurück