Vad är det som jag inte ha fattat? [C++]

Permalänk
Medlem

Vad är det som jag inte ha fattat? [C++]

Övar på ett gammalt prov och jag kommer ingenstans känns det som.

Antag följande klassdeklaration:

class Time { public: Time(int h, int min, int s); private: int h; int min; int s; };

Implementera konstruktorn.
Lägg till och implementera default konstruktor.
Lägg till och implementera << operatorn.
Lägg till och implementera additionsoperatorn som adderar två Time objekt.
Hur kunde du ändra på klassen så att objekt av den använde mindre minne, medan
vissa operationer kanske krävde mera processortid?

Är helt förbryllad, vad är skillnad mellan konstruktorn och default konstruktor?
Lägg till och implementera << operatorn. Vad är detta? Skall det kanske vara en cout funktion eller en print funktion?

Här e iaf mitt försök. Jag vet att det är klumpigt och att Time objekten adderas på helt fel sätt.

#include <iostream> using namespace std; class Time { public: Time(int h, int min, int s); Time(); ~Time(); int timme (void) {return timmar;} int minut (void) {return minuter;} int sekund (void) {return sekunder;} int timmar, minuter, sekunder; private: int *hour; int *minutes; int *seconds; }; Time::Time(int h, int min, int s) { timmar = h; hour = new int[h]; minuter = min; minutes = new int[min]; sekunder = s; seconds = new int[s]; }; Time::Time() { }; Time::~Time() { }; int main() { Time idag (21,11,31); Time igår (11,11,11); cout << "klockslag adderade: " << idag.timme() + igår.timme() << ":" << idag.minut() + igår.minut() << ":" << idag.sekund() + igår.sekund() << endl; }

Det som petar mig mest är att jag ändrade namnen på de privata datamedlemmarna. För att jag komma frammåt. Hur skall jag ta mig till för att lättast lösa denna uppgift?

Permalänk
Medlem

Jag rekommenderar varmt "Programmeringsspråket C++" av Bjarne Stroustrup. Fördelen med denna boken är att det är den enda jag läst som inte bara svarar på HUR man programmerar utan också t.ex. hur man angriper ett problem, varför syntaxen ser ut som den gör etc. (Bjarna skrev den ursprungliga specen för C++ och gjorde det mesta av den ursprungliga UNIX-implementationen.)
Här kommer ändå några vänliga tips:
Q: helt förbryllad, vad är skillnad mellan konstruktorn och default konstruktor?
A: Default konstruktor har ett void argument, andra konstruktorer kan ha andra konstruktorer, t.ex. ett objekt av samma klass.
Q: Lägg till och implementera << operatorn. Vad är detta?
A: En operator är en vänsterbunden medlemsmetod. Kort sagt så skall du skriva en fungerande metod Time::<<(), som gör det vanliga (I det här fallet skriver ut tiden på lämpligt format, t.ex. hh:mm:ss).

Addition skall också implementeras som en operator, dvs. du skriver en medlemsfunktion Time::+(). Då kan man i main anropa operationer så som
Time t = t1 + t2;
Där t1 och t2 är objekt av Time-klassen.

Permalänk
Medlem
Skrivet av Oldskool:

Jag rekommenderar varmt "Programmeringsspråket C++" av Bjarne Stroustrup. Fördelen med denna boken är att det är den enda jag läst som inte bara svarar på HUR man programmerar utan också t.ex. hur man angriper ett problem, varför syntaxen ser ut som den gör etc. (Bjarna skrev den ursprungliga specen för C++ och gjorde det mesta av den ursprungliga UNIX-implementationen.)
Här kommer ändå några vänliga tips:
Q: helt förbryllad, vad är skillnad mellan konstruktorn och default konstruktor?
A: Default konstruktor har ett void argument, andra konstruktorer kan ha andra konstruktorer, t.ex. ett objekt av samma klass.
Q: Lägg till och implementera << operatorn. Vad är detta?
A: En operator är en vänsterbunden medlemsmetod. Kort sagt så skall du skriva en fungerande metod Time::<<(), som gör det vanliga (I det här fallet skriver ut tiden på lämpligt format, t.ex. hh:mm:ss).

Addition skall också implementeras som en operator, dvs. du skriver en medlemsfunktion Time::+(). Då kan man i main anropa operationer så som
Time t = t1 + t2;
Där t1 och t2 är objekt av Time-klassen.

Tack! Där blev det lite klarare!

Permalänk
Medlem

class Time { public: Time(int h, int min, int s); private: int h; int min; int s; }; Time::Time(int h, int min, int s) { this->h=h; this->min=min; this->s=s; }; Time::Time() { h=min=s=0; };

Det är mitt förslag på början på denna uppgift.
För att minska minnesanvändningen så kan du skriva om timmar i sekunder och även minuter till sekunder. Det räcker då med en privat variabel för att räkna antalet sekunder.
Med h=23 m=59 s=59 så blir tiden i sekunder = 82800+3540+59 = 86399 som du ser krävs 17bitar för att representera detta talet, så en 32bitars integer räcker got och väl. Skillnaden blir att konstruktorn kommer kräva 2 multiplikationer och 2 additioner och en tilldelning istället för de tre tilldelningar som annars görs. Vidare kommer addition (och subtraktion bli enklare att implementera) utskrift av tiden och att hämta ut timmar, minuter och sekunder kommer kräva division och modulo operationer vilket blir lite dyrare.

Visa signatur

weeeee

Permalänk
Medlem

Ok! Koden ser nu ut på detta vis:

#include <ctime> #include <iostream> using namespace std; class Time { int hr, min, sec; public: Time(int h, int m , int s); Time(); void Display(); void addera(Time t1, Time t2) { sec = t1.sec + t2.sec; if (sec > 59) {sec -=60; min++;} min += t1.min +t2.min; if(min>59) {min-=60; hr++;} hr += t1.hr + t2.hr; } private: int h; int m; int s; }; Time::Time(int h, int m, int s) { hr = h; min = m; sec = s; cout << "The time is set!\n"; } Time::Time() { hr = 0; min = 0; sec = 0; }; void Time::Display() { cout << "Time is: " << hr << ":" << min << ":" << sec << "\n"; } int main() { Time a (12,11,33); Time b (10,34,50); Time c; a.Display(); b.Display(); c.addera(a,b); c.Display(); }

Det var väll nästan så som du menade?

Men jag fattar fortfarande inte vaför jag måste deklarera int hr, min, sec; i början, känns lite onödigt när det redan finns int h; int m; int s; under private!

Sen så skulle jag vela ha void addera(Time t1, Time t2) på detta sett void Time::Addera() som void Time::Display() Visual studio gnällde på att jag inte kunde deklarera Addera utanföre sin class??!

Permalänk

Jag började med C++ igår men jag skulle ändå vilja påstå att det är fel.

Time::Time() { hr = 0; min = 0; sec = 0; };

Borde inte vara }; efter class

Citat:

Men jag fattar fortfarande inte vaför jag måste deklarera int hr, min, sec; i början, känns lite onödigt när det redan finns int h; int m; int s; under private!

Måste du verkligen ha dem som private? Tror de är privata till klassen från början

Permalänk
Medlem

Ja, de är automagiskt private i klasser och public i strukturer. Detta är dumt att använda! Det blir otydligt då.
Men, du skall inte skriva "int hr, min, sec;", ta bort den raden. Du berättar ju detta under "private:".

Citat:

Borde inte vara }; efter class

Jo efter class declaration, men inte efter en funktionsdefinition (som det är i det här fallet), så ja, ";" ska bort.
Sedan borde du inte definera "void addera(Time t1, Time t2)" i klassdeklarationen. Definiera den precis som de andra funktionerna.
Du bör använda initialization lists till constrcutorn. d.v.s.

ClassA::ClassA(int timma, int dag) : m_timma(timma), m_dag(dag) { }

I regel skall alltid constrcutorns initialization list definera alla medlemmar.

Visa signatur

citera!