05. marts 2003 - 11:33Der er
13 kommentarer og 2 løsninger
Et project med et ur som object
Hej, Jeg er gaaet i staa med et lille project. For at saette jer ind i problemet, vil jeg lige opremse kravene. Jeg har til opgave at designe og implementere et ur. Uret skal kunne vise tidspunkter som 9:48 P.M. osv. Disse member functions skal projectet mindst indeholde:
1. En default constructor der saetter tiden til midnat 2. function der angiver en bestemt tid. 3. functioner der faar denne information: current hour, current minute og en Boolean function for at bestemme om det er A.M eller P.M 4. En function til at stille tiden frem ved hjaelp af et bestemt antal minutter. 5. Copy constructor 6. overload << >> og bruge + =, + operators
Mit problem er at finde ud af hvornaar jeg skal kalde de forkellige funktioner fra main og hvordan og hvorledes jeg faar kaedet det sammen. Nedenfor er mit foreloebige program, forhaabetlig er der en der kan hjaelpe mig paa rette vej. Paa forhaand mange tak!
#include <cassert> #include <iostream> #include <cstdlib> using namespace std; class clock { public: // CONSTRUCTOR clock( ); // MODIFICATION FUNCTIONS //void set_time(int hour, int minute, bool morning); //void advance(int minutes); // CONSTANT FUNCTIONS int get_hour( ) const; int get_minute( ) const; bool is_morning( ) const; private: int my_hour; int my_minute; int my_morning; };
bool operator <(const clock& c1, const clock& c2) { // Check whether one is morning and the other is not if (c1.is_morning( ) && !c2.is_morning( )) return true; else if (c2.is_morning( ) && !c1.is_morning( )) return false;
// Check whether one is 12 o'clock and the other is not else if ((c1.get_hour( ) == 12) && (c2.get_hour( ) != 12)) return true; else if ((c2.get_hour( ) == 12) && (c1.get_hour( ) != 12)) return false;
// Check whether the hours are different from each other else if (c1.get_hour( ) < c2.get_hour( )) return true; else if (c2.get_hour( ) < c1.get_hour( )) return false;
// The hours are the same, so check the minutes else if (c1.get_minute( ) < c2.get_minute( )) return true; else return false; }
Lad constructoren,copy constructor og += bruge set_time, der virker på længere sigt bedre. Selvom copy constructoren i lige dette tilfælde kunne bruge binær kopiering er det normalt bedre at gøre det samme i alle tilfælde. Du kan centralisere konsistence check i en seperat function der kaldes af både set_time og +.
Mener du med 3. at en function skal have en functions parameter eller mener du at den skal returnere en bool?
Tak jpk og Segmose for jeres svar. Jeg vil proeve at komme videre med mit projekt. Segmose, kan du evt. give et eksempel med copy constructoren - jeg er ikke sikker paa at jeg helt har forstaaet det.
Jeg vender hoejst sandsynligt tilbage med nogle spoergsmaal, haaber i har mod paa det. Tak!
Du kunne også lave den som: clock::clock(clock& copyFrom) { my_hour = copyFrom.get_hour(); my_minute = copyFrom.get_minute(); my_morning = copyFrom.is_morning(); }
Det er generelt et spørgsmål om personlig holdning og stil...
Hvis du har flere forskellige (overloadede) constructors og complicerede initialiseringer skal man jo ikke skrive hele koden en gang til men lave de specielle ting for den enkelte constructor og så kalde Setup() med passende parameter. skal man jo ikke skreve
Tak for forklaringen af copy constructoren. Jeg har forsoegt at kalde mine funktioner, men er desvaerre meget i tvivl om hvordan jeg skal kalde alle. Som i kan se har jeg kaldt set_time(9, 48, true), get_hour(),get_minute() samt is_morning(), men efter the gik jeg i staa med advance (1500). Set_time ser ud til at virke efter planen, jeg skal bare have fundet ud af hvordan den viser A.M og P.M. Kan i hjaelpe mig med brugen af mine funktioner? Hvad med copy constructoren, hvordan bliver den kaldt? Jeg beklager at mine spoergsmaal er lidt begynderagtige, men jeg bliver forhaabentlig klogere hver gang ;-) Jeg har pastet mit opdaterede project.
#include <cassert> #include <iostream> // Provides cout and cin #include <cstdlib> // Provides EXIT_SUCCESS using namespace std; // Allows all Standard Library items to be used class clock { public: // CONSTRUCTOR clock( ); //clock(clock& copyFrom);// copy constructor // MODIFICATION FUNCTIONS void set_time(int hour, int minute, bool morning); void advance(int minutes); // CONSTANT FUNCTIONS int get_hour( ) const; int get_minute( ) const; bool is_morning( ) const; private: int my_hour; int my_minute; int my_morning; };
/* bool operator <(const clock& c1, const clock& c2) { // Check whether one is morning and the other is not if (c1.is_morning( ) && !c2.is_morning( )) return true; else if (c2.is_morning( ) && !c1.is_morning( )) return false;
// Check whether one is 12 o'clock and the other is not else if ((c1.get_hour( ) == 12) && (c2.get_hour( ) != 12)) return true; else if ((c2.get_hour( ) == 12) && (c1.get_hour( ) != 12)) return false;
// Check whether the hours are different from each other else if (c1.get_hour( ) < c2.get_hour( )) return true; else if (c2.get_hour( ) < c1.get_hour( )) return false;
// The hours are the same, so check the minutes else if (c1.get_minute( ) < c2.get_minute( )) return true; else return false; } */
så ja, samme problem forskellig steder det skal løses. assignment har yderligere problemer med at data i objectet allerede er initialiseret/constructed.
yderligere så vidt jeg husker gælder det også når man value overføre classer.
Alle felterne er tomme og jeg kan desvarre ikke laese de svar i har givet. Kan i laese dem og i saafald, kan i paste dem ind i et nyt? Paa forhaand tak!
Jeg havde haabet paa at teksten vill dukke op igen, saa jeg kunne se jeres fra fra den 6/3 klokken 11.36. Jeg har arbejdet videre paa mit projekt og har faaet lidt mere til at virke, men er desvaerre gaaet i staa. Jeg har nu inkluderet alle de funktioner som skal vaere i projectet og min default constructor, set_time, samt advance functionerne virker. Som i kan se se har jeg oprettet en function der hedder "printStandard ()", men det er kun en midlertidig loesning da jeg skal overloade output og input operatorer (hvilket jeg har gjort et forsoeg paa - uden held). Derudover ved jeg ikke hvordan jeg skal kalde copy constructoren, samt disse functioner: bool operator <(const clock& c1, const clock& c2); clock operator +(const clock& c1, const clock& c2); bool operator == (const clock& c1, const clock& c2); Jeg haaber i kan hjaelpe mig. Paa forhaand tak!
#include <cassert> #include <iostream> // Provides cout and cin #include <fstream> #include <iomanip> #include <cstdlib> // Provides EXIT_SUCCESS using namespace std; // Allows all Standard Library class clock { public: // CONSTRUCTOR clock( );// default constructor clock(clock& copyFrom);// copy constructor // MODIFICATION FUNCTIONS void set_time(int hour, int minute, bool morning); void advance(int minutes); // CONSTANT FUNCTIONS int get_hour( ) const; int get_minute( ) const; bool is_morning( ) const; void printStandard ();//Print standard time format friend istream& operator >>( istream& input, clock& time); private: int my_hour; int my_minute; int my_morning; }; // NONMEMBER FUNCTION for the clock class: bool operator <(const clock& c1, const clock& c2); clock operator +(const clock& c1, const clock& c2); bool operator == (const clock& c1, const clock& c2); void printStandard ();//Print standard time format ostream& operator <<( ostream& output, clock& time);
bool operator <(const clock& c1, const clock& c2) { // Check whether one is morning and the other is not if (c1.is_morning( ) && !c2.is_morning( )) return true; else if (c2.is_morning( ) && !c1.is_morning( )) return false;
// Check whether one is 12 o'clock and the other is not else if ((c1.get_hour( ) == 12) && (c2.get_hour( ) != 12)) return true; else if ((c2.get_hour( ) == 12) && (c1.get_hour( ) != 12)) return false;
// Check whether the hours are different from each other else if (c1.get_hour( ) < c2.get_hour( )) return true; else if (c2.get_hour( ) < c1.get_hour( )) return false;
// The hours are the same, so check the minutes else if (c1.get_minute( ) < c2.get_minute( )) return true; else return false; }
/* clock operator +(const clock& c1, const clock& c2) { double x_total, y_total; // computes the x and y of the sum. x_total = (c1.get_minute () + c2.get_minute ()); y_total = (c1.get_hour () + c2.get_hour ()); clock total(x_total, y_total); //maaske return x_total, y_total return total; /*
Er der en der har et overblik over hvad der er galt.
Jeg paster lige mit project, for jeg har lave en del om:
#include <cassert> #include <iostream> // Provides cout and cin #include <fstream> #include <iomanip> #include <cstdlib> // Provides EXIT_SUCCESS using namespace std; // Allows all Standard Library items to be used class clock { public: // CONSTRUCTOR clock( );// default constructor clock(clock& copyFrom);// copy constructor // MODIFICATION FUNCTIONS void set_time(int hour, int minute, bool morning); void advance(int minutes); void clock:: operator +=(clock rhs); void clock:: operator = (clock rhs); // CONSTANT FUNCTIONS int get_hour( ) const; int get_minute( ) const; bool is_morning( ) const;
private: int my_hour; int my_minute; int my_morning; }; // NONMEMBER FUNCTION for the clock class: bool operator <(const clock& c1, const clock& c2); ostream& operator <<( ostream& output, clock& time);
int main( ) {
clock sample; clock c1; clock c2; clock c3; cout << "The initial standard time: " <<endl;; cout << sample;//initial standard time cout <<endl; cout << "The time set to: "; sample.set_time(9, 48, true);// Set the time to 9:48:AM cout <<endl; cout << sample; cout <<endl; cout <<"Adding 1500 min. to 9:48 A.M: "; sample.advance(1500); // Add 1500 minutes cout << endl; cout<< sample; cout << endl; cout <<"Checking if it's earlier or later than noon: "; cout <<endl; c1.set_time (4, 56, true); c2.set_time (3, 45, true); operator <(c1, c2); if (c1 < c2) cout << "The time is earlier than noon!" << endl; else cout << "The time is past noon!" << endl;
//********************************************************************************** bool operator <(const clock& c1, const clock& c2) { // Check whether one is morning and the other is not if (c1.is_morning( ) && !c2.is_morning( )) return true; else if (c2.is_morning( ) && !c1.is_morning( )) return false;
// Check whether one is 12 o'clock and the other is not else if ((c1.get_hour( ) == 12) && (c2.get_hour( ) != 12)) return true; else if ((c2.get_hour( ) == 12) && (c1.get_hour( ) != 12)) return false;
// Check whether the hours are different from each other else if (c1.get_hour( ) < c2.get_hour( )) return true; else if (c2.get_hour( ) < c1.get_hour( )) return false;
// The hours are the same, so check the minutes else if (c1.get_minute( ) < c2.get_minute( )) return true; else return false; } //**********************************************************************************
Jeg valgte at give jer 100 points hver. Nu fik jeg selv loest det det meste, men jeg saetter pris paa at i sidder og hjaelper folk som mig. Jeg takker!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.