1 / 26

Alumni Party

Alumni Party. The Alumni Party will take place on Tuesday, May 13 It would be great if we could have demos of your software projects!. Building GUIs under Linux. There are many toolkits available for building graphical user interfaces under Linux. Probably the most popular one is GTK+.

leiko
Download Presentation

Alumni Party

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Alumni Party • The Alumni Party will take place on • Tuesday, May 13 • It would be great if we could have demos of your software projects! CS410 – Software Engineering Lecture #12: Advanced C++ I

  2. Building GUIs under Linux • There are many toolkits available for building graphical user interfaces under Linux. • Probably the most popular one is GTK+. • You can find a nice and comprehensive tutorial at: • http://developer.gnome.org/gtk-tutorial/2.90/ • This tutorial also explains how to download and install the required libraries and compile your code. CS410 – Software Engineering Lecture #12: Advanced C++ I

  3. ADT Conversions • Remember: We can provide a special conversion function inside a user-defined class. • The general form of such a member function is: • operator type() { … } • Such a member function must • be nonstatic, • have no parameters, • have no declared return type, • return an expression of the designated type. CS410 – Software Engineering Lecture #12: Advanced C++ I

  4. ADT Conversions • For example, we could add such a special conversion function to the ModInt class: • ModInt::operator int() • { • return v; • } • Then the following code is correct: • int i = 39; • ModInt m; • i = m; CS410 – Software Engineering Lecture #12: Advanced C++ I

  5. Overloading Operators • We now know how to use the operator keyword to define a type-conversion member function. • We will now take a look at how to use the operator keyword to overload the built-in C++ operators. • We have already seen that overloading can give a function name a variety of meanings, depending on its arguments. • Overloading operators • can give additional meanings to the built-in operators such as ‘+’, • allows infix expressions of both ADTs and built-in types, • leads to shorter, more readable programs. CS410 – Software Engineering Lecture #12: Advanced C++ I

  6. Overloading Operators • Example: • class Foo • { • public: • Foo operator-(); // unary minus: -Foo • Foo operator-(int); // binary minus: Foo – int • Foo operator-(Foo); // binary minus: Foo – Foo • }; • Foo operator-(int, Foo); // binary minus: int - Foo CS410 – Software Engineering Lecture #12: Advanced C++ I

  7. Unary Operator Overloading • Example: • class Clock • { • public: • Clock(unsigned long i); • void Print() const { cout << mins << ":" << secs << endl; } • void Tick(); // add one second • Clock operator++() { Tick(); return *this; } • private: • unsigned long totSecs, secs, mins; • }; CS410 – Software Engineering Lecture #12: Advanced C++ I

  8. Unary Operator Overloading • Clock::Clock(unsigned long i) • { • totSecs = i; • secs = totSecs % 60; // convert into minutes-seconds format • mins = (totSecs / 60) % 60; • } • void Clock::Tick() • { • Clock Temp = Clock(++totSecs); • secs = Temp.secs; • mins = Temp.mins; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  9. Unary Operator Overloading • int main() • { • Clock C1(59), C2(600); • cout << "Initial times:" << endl; • C1.Print(); • C2.Print(); • cout << endl; • ++C1; // increase times by one second • ++C2; • cout << "After one second times are:" << endl; • C1.Print(); • C2.Print(); • cout << endl; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  10. Unary Operator Overloading • Output: • Initial times: • 0:59 • 10:0 • After one second times are: • 1:0 • 10:1 CS410 – Software Engineering Lecture #12: Advanced C++ I

  11. Unary Operator Overloading • We could also have overloaded the prefix ++ by using an ordinary function: • Clock operator++(Clock& C) • { • C.Tick(); • return C; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  12. Binary Operator Overloading • We continue with our clock example and show how to overload binary operators. • When a binary operator is overloaded using a member function, it has • as its first argument the implicitly passed class variable, • as its second argument the single argument-list parameter. • Friend functions and ordinary functions have both arguments specified in the parameter list. • Of course, ordinary functions cannot access private members. CS410 – Software Engineering Lecture #12: Advanced C++ I

  13. Binary Operator Overloading • class Clock • { • … • friend Clock operator+(Clock C1, Clock C2); • }; • Clock operator+(Clock C1, Clock C2) • { • return (C1.totSecs + C2.totSecs); • } • Here, the Clock constructor provides the implicit conversion from unsigned long to Clock. CS410 – Software Engineering Lecture #12: Advanced C++ I

  14. Binary Operator Overloading • Analogously, we can overload the multiplication operator: • class Clock • { • … • friend Clock operator*(unsigned long factor, Clock C); • } • Clock operator*(unsigned long factor, Clock C) • { • return (factor*C.totSecs); • } • Notice that this function demands a fixed ordering (unsigned long * Clock). CS410 – Software Engineering Lecture #12: Advanced C++ I

  15. Binary Operator Overloading • To avoid this, we can add a second overloaded function: • Clock operator*(Clock C, unsigned long factor) • { • return (factor*C); • } • Notice that this second function overloading ‘*’ is defined in terms of the first one. • Therefore, we do not need to make it a friend function. CS410 – Software Engineering Lecture #12: Advanced C++ I

  16. Binary Operator Overloading • Testing the new functions: • int main() • { • … • cout << "The sum of these times is:" << endl; • Clock C3 = C1 + C2; • C3.Print(); • cout<< endl; • cout << "Multiplied by two is:" << endl; • Clock C4 = 2*C3; • C4.Print(); • cout<< endl; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  17. Binary Operator Overloading • Output: • Initial times: • 0:59 • 10:0 • After one second times are: • 1:0 • 10:1 • The sum of these times is: • 11:1 • Multiplied by two is: • 22:2 CS410 – Software Engineering Lecture #12: Advanced C++ I

  18. Overloading the << Operator • Do you remember the Clock example? • class Clock • { • public: • Clock(unsigned long i = 0); • void Print() const { cout << mins << ":" << secs << endl; } • void Tick(); // add one second • Clock operator++() { Tick(); return *this; } • private: • unsigned long totSecs, secs, mins; • }; CS410 – Software Engineering Lecture #12: Advanced C++ I

  19. Overloading the << Operator • Printing a time value works as follows: • int main() • { • Clock C1(59), C2(600); • cout << "Initial times:" << endl; • C1.Print(); • C2.Print(); • cout << endl; • } • It would be more convenient to use the << operator for creating output, so we are going to overload the << operator for Clock objects. CS410 – Software Engineering Lecture #12: Advanced C++ I

  20. Overloading the << Operator • How does the << operator work? • Example: • int main() • { • string text1(“John is ”), text2(“years old.”); • int age = 43; • cout << text1 << age << text2; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  21. Overloading the << Operator cout << age << text2; cout << text2; … • cout << text1 << age << text2; ostream &operator<<(ostream &ostr, string &s); cout << age << text2; ostream &operator<<(ostream &ostr, int i); CS410 – Software Engineering Lecture #12: Advanced C++ I

  22. Overloading the << Operator • In order to overload the << operator for printing Clock objects, we add the following code to the Clock class: • class Clock • { • public: • … • friend ostream &operator<<(ostream &out, Clock C); • … • }; • ostream &operator<<(ostream &out, Clock C) • { • return (out << C.mins << ":" << C.secs); • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  23. Overloading the << Operator • With this addition, we can output Clock values as follows: • int main() • { • Clock C1(59), C2(600); • cout << "Initial times:\n" << C1 << "\n" << C2; • C1++; • C2++; • cout << "\n\nAfter one second times are:\n" << C1 << "\n" << C2; • Clock C3 = C1 + C2; • cout << "\n\nThe sum of these times is:\n" << C3; • Clock C4 = 2*C3; • cout << "\n\nMultiplied by two is:\n" << C4 << "\n"; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

  24. Overloading the << Operator • The output looks like before: • Initial times: • 0:59 • 10:0 • After one second times are: • 1:0 • 10:1 • The sum of these times is: • 11:1 • Multiplied by two is: • 22:2 CS410 – Software Engineering Lecture #12: Advanced C++ I

  25. Overloading the << Operator • Overloading the <<, (), and = operators can be nicely demonstrated with the Matrix example. • In order to overload the << operator for printing matrices, we add the following code: • class Matrix • { • public: • … • friend ostream &operator<<(ostream &out, const Matrix &m); • … • }; • (continued on next slide) CS410 – Software Engineering Lecture #12: Advanced C++ I

  26. Overloading the << Operator • ostream &operator<<(ostream &out, const Matrix &m) • { • out << endl; • for (int y = 0; y < m.dy; y++) • { • for (int x = 0; x < m.dx; x++) • out << m.p[x][y] << "\t"; • out << endl; • } • return out; • } CS410 – Software Engineering Lecture #12: Advanced C++ I

More Related