modern c++ object-oriented programmingmanyi/teaching/c++/cpp_v1.2.pdf · 2018-12-19 · modern c++...
TRANSCRIPT
![Page 1: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/1.jpg)
Modern C++ Object-Oriented Programming
''Combine old and newer features to get the best out of the language''
Margit ANTAL2018
CPP
![Page 2: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/2.jpg)
2
C++ - Object-Oriented Programming
Course content
– Introduction to C++
– Object-oriented programming
– Generic programming and the STL
– Object-oriented design
![Page 3: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/3.jpg)
3
C++ - Object-Oriented Programming
References– Bjarne Stroustrup, Herb Sutter, C++ Core Guidelines, 2017.
– M. Gregoire, Professional C++, 3rd edition, John Wiley & Sons, 2014.
– S. Lippman, J. Lajoie, B. E. Moo, C++ Primer, 5th edition, Addison Wesley, , 2013.
– S. Prata, C++ Primer Plus, 6th edition, Addison Wesley, 2012.
– N. Josuttis, The C++ standard library. a tutorial and reference. Pearson Education. 2012.
– A. Williams, C++ Concurrency in Action:Practical Multithreading. Greenwich, CT: Manning. 2012.
![Page 4: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/4.jpg)
4
Module 1
Introduction to C++
![Page 6: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/6.jpg)
6
Introduction to C++
Content– History and evolution
– Overview of the key features
● New built-in types● Scope and namespaces● Enumerations
● Dynamic memory: new and delete
● Smart pointers: unique_ptr, shared_ptr, weak_ptr
● Error handling with exceptions● References
● The const modifier
![Page 7: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/7.jpg)
7
Introduction to C++History and evolution
– Creator: Bjarne Stroustrup 1983
– Standards: ● The first C++ standard
– 1998 (C++98, major)– 2003 (C++03, minor)
● The second C++ standard– 2011 (C++11, major) – significant improvements in language and
library– 2014 (C++14, minor)– 2017 (C++17, major)
![Page 8: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/8.jpg)
8
Introduction to C+History and evolution
–
source: https://isocpp.org/std/status
![Page 9: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/9.jpg)
9
Introduction to C++
Standard library– C++ standard library = C standard library + STL
(Standard Template Library)
– STL – designed by Alexander Stepanov, provides:● Containers: list, vector, set, map …● Iterators● Algorithms: search, sort, …
![Page 10: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/10.jpg)
10
Introduction to C++
Philosophy
– Statically typed
– General purpose
– Efficient
– Supports multiple programming styles:● Procedural programming● Object-oriented programming● Generic programming
![Page 11: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/11.jpg)
11
Introduction to C++
Portability
– Recompilation without making changes in the source code means portability.
– Hardware specific programs are usually not portable.
![Page 12: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/12.jpg)
12
Introduction to C++
Creating a program
– Use a text editor to write a program and save it in a file → source code
– Compile the source code (compiler is a program that translates the source code to machine language) → object code
– Link the object code with additional code (libraries) → executable code
![Page 13: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/13.jpg)
13
Introduction to C++
Creating a program (using GNU C++ compiler, Unix)
– Source code: hello.cpp
– Compile: g++ -c hello.cpp ● Output: hello.o (object code)
– Compile + Link: g++ hello.cpp● Output: a.out (executable code)
– C++ 2014: g++ hello.cpp -std=c++14
![Page 14: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/14.jpg)
14
Introduction to C++
The first C++ program
//hello.cpp
#include <iostream>using namespace std;
int main(){cout<<”Hello”<<endl;return 0;
}
One-line comment
The main function
I/O streams
#include <iostream>
int main(){std::cout<<”Hello”<<std::endl;return 0;
}
Preprocessor directive
![Page 15: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/15.jpg)
15
Introduction to C++
Building a C++ program: 3 steps
– preprocessor (line starting with #)
– compiler
– linker
![Page 16: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/16.jpg)
16
Introduction to C++
Most common preprocessor directives– #include [file]
● the specified file is inserted into the code– #define [key] [value]
● every occurrence of the specified key is replaced with the specified value
– #ifndef [key] … #endif● code block is conditionally included
![Page 17: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/17.jpg)
17
Introduction to C++
Header files– C++ header
● #include <iostream>– C header
● #include <cstdio>– User defined header
● #include "myheader.h"
![Page 18: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/18.jpg)
18
Introduction to C++
Avoid multiple includes//myheader.h
#ifndef MYHEADER_H#define MYHEADER_H
// the contents
#endif
![Page 19: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/19.jpg)
19
Introduction to C++
The main() function– int main(){ … }
or– int main( int argc, char* argv[] ){ … }
The number of arguments
The argumentsResult status
![Page 20: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/20.jpg)
20
Introduction to C++
I/O Streams– cout: standard output
cout<<”Hello, world!”<<endl;
– cin: standard input
int i; double d;
cin >> i >> d;
End of line
![Page 21: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/21.jpg)
21
Introduction to C++
Namespaces
– avoid naming conflicts//my1.hnamespace myspace1{ void foo();}
//my2.hnamespace myspace2{ void foo();}
//my1.cpp#include "my1.h"namespace myspace1{ void foo(){ cout<<"myspace1::foo\n"; }}
//my2.cpp#include "my2.h"namespace myspace2{ void foo(){ cout<<"myspace2::foo\n"; }}
myspace1::foo() myspace2::foo()
![Page 22: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/22.jpg)
22
Introduction to C++
Variables
– can be declared almost anywhere in your code
double d; //uninitialized
int i = 10; //initialized
int j {10}; //initialized,
//uniform initialization
![Page 23: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/23.jpg)
23
Introduction to C++
Variable types– short, int, long – range depends on compiler, but usually 2, 4, 4
bytes
– long long (C++11) – range depends on compiler – usually 8 bytes
– float, double, long double
– bool
– char, char16_t(C++11), char32_t(C++11), wchar_t
– auto (C++11) – the compiler decides the type automatically (auto i=7;)
– decltype(expr) (C++11)
int i=10;
decltype(i) j = 20; // j will be int
![Page 24: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/24.jpg)
24
Introduction to C++
Variable types–#include <iostream>using namespace std;
int main(int argc, char** argv) { cout<<"short : "<<sizeof( short)<<" bytes"<<endl; cout<<"int : "<<sizeof( int ) <<" bytes"<<endl; cout<<"long : "<<sizeof( long) <<" bytes"<<endl; cout<<"long long: "<<sizeof( long long)<<" bytes"<<endl; return 0;}
![Page 25: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/25.jpg)
25
Introduction to C++
C enumerations (not type-safe)
– always interpreted as integers →● you can compare enumeration values from completely
different types
enum Fruit{ apple, strawberry, melon};
enum Vegetable{ tomato, cucumber, onion};
void foo(){ if( tomato == apple){ cout<<"Hurra"<<endl; }}
![Page 26: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/26.jpg)
26
Introduction to C++
C++ enumerations (type-safe)
enum class Mark { Undefined, Low, Medium, High };
Mark myMark( int value ){ switch( value ){ case 1: case2: return Mark::Low; case 3: case4: return Mark::Medium; case 5: return Mark::High; default: return Mark::Undefined; }}
![Page 27: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/27.jpg)
27
Introduction to C++
Range-based for loopint elements[]{1,2,3,4,5};
for( auto& e: elements){cout<<e<<endl;
}
![Page 28: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/28.jpg)
28
Introduction to C++
The std::array
– replacement for the standard C-style array
– cannot grow or shrink at run time
#include <iostream>#include <array>using namespace std;
int main() { array<int, 5 > arr {10, 20, 30, 40, 50}; cout << "Array size = " << arr.size() << endl; for(int i=0; i<arr.size(); ++i){ cout<<arr[ i ]<<endl; }}
![Page 29: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/29.jpg)
29
rtarray
Stack Heap
Introduction to C++
Pointers and dynamic memory– compile time array
int ctarray[ 3 ]; //allocated on stack
– run time array int * rtarray = new int[ 3 ]; //allocated on heap
![Page 30: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/30.jpg)
30
Introduction to C++
Dynamic memory management
– allocation
int * x = new int;
int * t = new int [ 3 ];
– deletion
delete x;
delete [] t;
![Page 31: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/31.jpg)
31
Introduction to C++
Strings
– C-style strings:● array of characters● '\0' terminated
● functions provided in <cstring>
– C++ string● described in <string>
string firstName = "John"; string lastName = "Smith";
string name = firstName+ " "+ lastName; cout<<name<<endl;
![Page 32: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/32.jpg)
32
Introduction to C++
References
– A reference defines an alternative name (alias) for an object.
– A reference must be initialized.
– Defining a reference = binding a reference to its initializer
int i = 10;
int &ri = i; //OK ri refers to (is another name for) i
int &ri1; //ERROR: a reference must be initialized
![Page 33: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/33.jpg)
33
Introduction to C++
Operations on references
– the operation is always performed on the referred object
int i = 10;
int &ri = i;
++ri;
cout<<i<<endl; // outputs 11
++i;
cout<<ri<<endl; // outputs 12
![Page 34: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/34.jpg)
34
Introduction to C++
References as function parameters
– to permit pass-by-reference:● allow the function to modify the value of the parameter● avoid copies
void inc(int &value){
value++; }
usage:int x = 10;inc( x );
bool isShorter(const string &s1, const string &s2){
return s1.size() < s2.size();}usage:string str1 ="apple";string str2 ="nut";cout<<str1<<"<"<<str2<<": " << isShorter(str1, str2);
![Page 35: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/35.jpg)
35
Introduction to C++
Exceptions
– Exception = unexpected situation
– Exception handling = a mechanism for dealing with problems
● throwing an exception – detecting an unexpected situation
● catching an exception – taking appropriate action
![Page 36: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/36.jpg)
36
Introduction to C++
Exceptions: exception
–#include <iostream>#include <stdexcept>using namespace std;
double divide( double m, double n){ if( n == 0 ){ throw exception(); }else{ return m/n; }}
int main() { try{ cout<<divide(1,0)<<endl; }catch( const exception& e){ cout<<"Exception was caught!"<<endl; }}
![Page 37: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/37.jpg)
37
Introduction to C++
Exceptions: domain_error
–#include <iostream>#include <stdexcept>using namespace std;
double divide( double m, double n){ if( n == 0 ){ throw domain_error(“Division by zero”); }else{ return m/n; }}
int main() { try{ cout<<divide(1,0)<<endl; }catch( const exception& e){ cout<<"Exception: "<<e.what()<<endl; }}
![Page 38: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/38.jpg)
38
Introduction to C++
The const modifier
– Defining constants
– Protecting a parameter
const int N =10;int t[ N ];const int N =10;int t[ N ];
void sayHello( const string& who){ cout<<"Hello, "+who<<endl; who = "new name";}
Compiler error
![Page 39: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/39.jpg)
39
Uniform initialization (C++ 11)brace-init
int n{2}; string s{"alma"}; map<string,string> m {
{"England","London"}, {"Hungary","Budapest"}, {"Romania","Bucharest"} }; struct Person{ string name; int age; }; Person p{"John Brown", 42};
![Page 40: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/40.jpg)
40
Introduction to C++
Using the standard library
–
–
const int N =10;int t[ N ];
#include <string>#include <vector>#include <iostream>using namespace std;
int main() { vector<string> fruits {"apple","melon"}; fruits.push_back("pear"); fruits.push_back("nut"); // Iterate over the elements in the vector and print them for (auto it = fruits.cbegin(); it != fruits.cend(); ++it) { cout << *it << endl; } //Print the elements again using C++11 range-based for loop for (auto& str : fruits) cout << str << endl; return 0;}
![Page 41: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/41.jpg)
41
Introduction to C++
Programming task:
– Write a program that reads one-word strings from the standard input, stores them and finally prints them on the standard output
– Sort the container before printing● use the sort algorithm
–
#include <algorithm>...vector<string> fruits;... sort(fruits.begin(),fruits.end());
![Page 42: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/42.jpg)
42
Module 2
Object-Oriented Programming
Classes and Objects
![Page 43: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/43.jpg)
43
Object-Oriented Programming (OOP)
Content
– Classes and Objects
– Advanced Class Features
– Operator overloading
– Object Relationships
– Abstraction
![Page 44: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/44.jpg)
44
OOP: Classes and Objects
Content
– Members of the class. Access levels. Encapsulation.
– Class: interface + implementation
– Constructors and destructors
– const member functions
– Constructor initializer
– Copy constructor
– Object's lifecycle
![Page 45: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/45.jpg)
45
OOP: Types of Classes
Types of classes:– Polymorphic Classes – designed for extension
● Shape, exception, ...
– Value Classes – designed for storing values● int, complex<double>, ...
– RAII (Resource Acquisition Is Initialization) Classes –
(encapsulate a resource into a class → resource lifetime object lifetime)
● thread, unique_ptr, ...
What type of resource?
![Page 46: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/46.jpg)
46
OOP: Classes and objects
Class = Type ( Data + Operations) – Members of the class
– Data:
● data members (properties, attributes)
– Operations:
● methods (behaviors)
– Each member is associated with an access level:
● private -
● public +
● protected #
![Page 47: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/47.jpg)
47
OOP: Classes and objects
Object = Instance of a class
– An employee object: Employee emp;
● Properties are the characteristics that describe an object.
– What makes this object different?● id, firstName, lastName, salary, hired
● Behaviors answer the question:– What can we do to this object?
● hire(), fire(), display(), get and set data members
![Page 48: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/48.jpg)
48
OOP: Classes and objects
Encapsulation – an object encapsulates data and functionality.
Data
Functionality
class TYPES
Employee
- m Id: in t- m FirstNam e: string- m LastNam e: string- m Salary: in t- bHired: bool
+ Em ployee()+ display() : void {query}+ hi re() : void+ fi re() : void+ setFi rstNam e(string) : void+ setLastNam e(string) : void+ setId(int) : vo id+ setSalary(int) : vo id+ getFi rstNam e() : string {query}+ getLastNam e() : string {query}+ getSalary() : in t {query}+ getIsHired() : bool {query}+ getId() : i n t {query}
![Page 49: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/49.jpg)
49
OOP: Classes and objects
Class creation
– class declaration - interface● Employee.h
– class definition – implementation● Employee.cpp
![Page 50: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/50.jpg)
50
OOP: Classes and objects
class Employee{public: Employee(); void display() const; void hire(); void fire(); // Getters and setters void setFirstName( string inFirstName ); void setLastName ( string inLastName ); void setId( int inId ); void setSalary( int inSalary ); string getFirstName() const; string getLastName() const; int getSalary() const; bool getIsHired() const;
int getId() const;private: int mId; string mFirstName; string mLastName; int mSalary; bool bHired;};
Methods' declaration
Data members
Employee.h
![Page 51: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/51.jpg)
51
OOP: Classes and objects
The Constructor and the object's state– The state of an object is defined by its data members.
– The constructor is responsible for the initial state of the object
Employee :: Employee() : mId(-1), mFirstName(""), mLastName(""), mSalary(0), bHired(false){
}
Employee :: Employee() { mId = -1; mFirstName=""; mLastName=""; mSalary =0; bHired = false;}
Members are initializedthrough the constructor initializer list
Members are assigned
Only constructors can use this initializer-list
syntax!!!
![Page 52: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/52.jpg)
52
OOP: Classes and objects
Constructors
– responsibility: data members initialization of a class object
– invoked automatically for each object
– have the same name as the class
– have no return type
– a class can have multiple constructors (function overloading)
– may not be declared as const
● constructors can write to const objects
![Page 53: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/53.jpg)
53
OOP: Classes and objects
Member initialization (C++11)
class C { string s ("abc"); double d = 0; char * p {nullptr}; int y[4] {1,2,3,4}; public: C(){} };
class C { string s; double d; char * p; int y[5]; public: C() : s("abc"), d(0.0),
p(nullptr), y{1,2,3,4} {}
};
Compiler
![Page 54: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/54.jpg)
54
OOP: Classes and objects
Defining a member function
– Employee.cpp
– A const member function cannot change the object's state, can be invoked on const objects
void Employee::hire(){ bHired = true;}
string Employee::getFirstName() const{ return mFirstName;}
![Page 55: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/55.jpg)
55
OOP: Classes and objects
Defining a member function
void Employee::display() const { cout << "Employee: " << getLastName() << ", " << getFirstName() << endl; cout << "-------------------------" << endl; cout << (bHired ? "Current Employee" : "Former Employee") << endl; cout << "Employee ID: " << getId() << endl; cout << "Salary: " << getSalary() << endl; cout << endl;}
![Page 56: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/56.jpg)
56
OOP: Classes and objects
TestEmployee.cpp
– Using const member functionsvoid foo( const Employee& e){ e.display(); // OK. display() is a const member function e.fire(); // ERROR. fire() is not a const member function}
int main() { Employee emp; emp.setFirstName("Robert"); emp.setLastName("Black"); emp.setId(1); emp.setSalary(1000); emp.hire(); emp.display(); foo( emp ); return 0;}
![Page 57: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/57.jpg)
57
OOP: Classes and objects
#ifndef EMPLOYEE_H#define EMPLOYEE_H
#include <string>using namespace std;
class Employee{public: Employee(); //...protected: int mId; string mFirstName; string mLastName; int mSalary; bool bHired;};
#endif
Interface: Employee.h
#include "Employee.h"
Employee::Employee() : mId(-1), mFirstName(""), mLastName(""), mSalary(0), bHired(false){}
string Employee::getFirstName() const{ return mFirstName;}// ...
Implementation: Employee.cpp
![Page 58: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/58.jpg)
58
OOP: Classes and objects
Object life cycles:
– creation
– assignment
– destruction
![Page 59: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/59.jpg)
59
OOP: Classes and objects
Object creation:
– when an object is created,
● one of its constructors is executed,● all its embedded objects are also created
int main() { Employee emp; emp.display(); Employee *demp = new Employee(); demp->display(); // .. delete demp; return 0;}
object'slifecycle
![Page 60: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/60.jpg)
60
OOP: Classes and objects
Object creation – constructors:
– default constructor (0-argument constructor)
– when you need● Employee employees[ 10 ];● vector<Employee> emps;
–
Employee :: Employee() : mId(-1), mFirstName(""), mLastName(""), mSalary(0), bHired(false){}
Employee :: Employee() {}
● memory allocation● constructor call on
each allocated object
![Page 61: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/61.jpg)
61
OOP: Classes and objects
Object creation – constructors:
– Compiler-generated default constructor
– if a class does not specify any constructors, the compiler will generate one that does not take any arguments
–
class Value{public:
void setValue( double inValue);double getValue() const;
private:double value;
};
![Page 62: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/62.jpg)
62
OOP: Classes and objects
Constructors: default and delete specifiers (C++ 11)
–
class X{int i = 4;int j {5};
public:X(int a) : i{a} {} // i = a, j = 5X() = default; // i = 4, j = 5
};
Explicitly forcing the automatic generation of a default constructor by the compiler.
![Page 63: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/63.jpg)
63
OOP: Classes and objects
Constructors: default and delete specifiers (C++ 11)
–
class X{public:
X( double ){} };
X x2(3.14); //OKX x1(10); //OK
class X{public:
X( int )= delete;X( double );
};X x1(10); //ERRORX x2(3.14); //OK
int → double conversion
![Page 64: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/64.jpg)
64
OOP: Classes and objects
Best practice: always provide default values for members! C++ 11
–
struct Point{ int x, y; Point ( int x = 0, int y = 0 ): x(x), y(y){}};class Foo{ int i {}; double d {}; char c {}; Point p {};public: void print(){ cout <<"i: "<<i<<endl; cout <<"d: "<<d<<endl; cout <<"c: "<<c<<endl; cout <<"p: "<<p.x<<", "<<p.y<<endl; }};
int main() { Foo f; f.print(); return 0;}
OUTPUT:i: 0d: 0c:p: 0, 0
![Page 65: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/65.jpg)
65
OOP: Classes and objects
Constructor initializerclass ConstRef{public: ConstRef( int& );private: int mI; const int mCi; int& mRi;};
ConstRef::ConstRef( int& inI ){ mI = inI; //OK mCi = inI; //ERROR: cannot assign to a const mRi = inI; //ERROR: uninitialized reference member}
ConstRef::ConstRef( int& inI ): mI( inI ), mCi( inI ), mRi( inI ){}
ctor initializer
![Page 66: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/66.jpg)
66
OOP: Classes and objects
Constructor initializer
– data types that must be initialized in a ctor-initializer● const data members● reference data members● object data members having no default
constructor● superclasses without default constructor
![Page 67: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/67.jpg)
67
OOP: Classes and objects
A non-default Constructor
Employee :: Employee( int inId, string inFirstName, string inLastName, int inSalary, int inHired) :
mId(inId), mFirstName(inFirstName), mLastName(inLastName), mSalary(inSalary), bHired(inHired){}
![Page 68: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/68.jpg)
68
OOP: Classes and objects
Delegating Constructor (C++11)
class SomeType{ int number;
public: SomeType(int newNumber) : number(newNumber) {} SomeType() : SomeType(42) {}};
![Page 69: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/69.jpg)
69
OOP: Classes and objects
Copy Constructor Employee emp1(1, "Robert", "Black", 4000, true);
– called in one of the following cases:● Employee emp2( emp1 ); //copy-constructor called● Employee emp3 = emp2; //copy-constructor called● void foo( Employee emp );//copy-constructor called
– if you don't define a copy-constructor explicitly, the compiler creates one for you
● this performs a bitwise copy
![Page 70: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/70.jpg)
70
OOP: Classes and objects
//Stack.h
#ifndef STACK_H#define STACK_H
class Stack{public: Stack( int inCapacity ); void push( double inDouble ); double top() const; void pop(); bool isFull() const; bool isEmpty()const; private: int mCapacity; double * mElements; double * mTop;};#endif /* STACK_H */
//Stack.cpp
#include "Stack.h"
Stack::Stack( int inCapacity ){ mCapacity = inCapacity; mElements = new double [ mCapacity ]; mTop = mElements; } void Stack::push( double inDouble ){ if( !isFull()){ *mTop = inDouble; mTop++; } }
![Page 71: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/71.jpg)
71
OOP: Classes and objects
//TestStack.cpp#include "Stack.h"
int main(){Stack s1(3);
Stack s2 = s1; s1.push(1); s2.push(2); cout<<"s1: "<<s1.top()<<endl; cout<<"s2: "<<s2.top()<<endl;}
mCapacity: 3mElements mTop
s1: Stack
0
2
1
mCapacity: 3mElements mTop
s2: Stack
![Page 72: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/72.jpg)
72
OOP: Classes and objects
Copy constructor: T ( const T&)
//Stack.h
#ifndef STACK_H#define STACK_H
class Stack{public: //Copy constructor Stack( const Stack& );private: int mCapacity; double * mElements; double * mTop;};#endif /* STACK_H */
//Stack.cpp
#include "Stack.h"
Stack::Stack( const Stack& s ){ mCapacity = s.mCapacity; mElements = new double[ mCapacity ]; int nr = s.mTop - s.mElements; for( int i=0; i<nr; ++i ){ mElements[ i ] = s.mElements[ i ]; } mTop = mElements + nr; }
![Page 73: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/73.jpg)
73
OOP: Classes and objects
//TestStack.cpp#include "Stack.h"
int main(){Stack s1(3);
Stack s2 = s1; s1.push(1); s2.push(2); cout<<"s1: "<<s1.top()<<endl; cout<<"s2: "<<s2.top()<<endl;}
mCapacity: 3mElements mTop
s1: Stack
0
2
1
mCapacity: 3mElements mTop
s2: Stack
0
2
1
![Page 74: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/74.jpg)
74
OOP: Classes and objects
Destructor
– when an object is destroyed:● the object's destructor is automatically invoked,● the memory used by the object is freed.
– each class has one destructor
– usually place to perform cleanup work for the object
– if you don't declare a destructor → the compiler will generate one, which destroys the object's member
![Page 75: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/75.jpg)
75
OOP: Classes and objects
Destructor
– Syntax: T :: ~T();Stack::~Stack(){ if( mElements != nullptr ){ delete[] mElements; mElements = nullptr; } }
{ // block beginStack s(10); // s: constructor
Stack* s1 = new Stack(5);// s1: constructor s.push(3);
s1->push(10);delete s1; //s1: destructors.push(16);
} // block end //s: destructor
![Page 76: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/76.jpg)
76
OOP: Classes and objects
Default parameters– if the user specifies the arguments → the defaults are ignored
– if the user omits the arguments → the defaults are used
– the default parameters are specified only in the method declaration (not in the definition)
//Stack.hclass Stack{public: Stack( int inCapacity = 5 );
..};//Stack.cppStack::Stack( int inCapacity ){ mCapacity = inCapacity; mElements = new double [ mCapacity ]; mTop = mElements;}
//TestStack.cpp
Stack s1(3); //capacity: 3Stack s2; //capacity: 5Stack s3( 10 ); //capacity: 10
![Page 77: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/77.jpg)
77
OOP: Classes and objects
The this pointer
– every method call passes a pointer to the object for which it is called as hidden parameter having the name this
– Usage:
● for disambiguation
Stack::Stack( int mCapacity ){ this → mCapacity = mCapacity; //..}
![Page 78: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/78.jpg)
78
OOP: Classes and objects
Programming task [Prata] class Queue {
enum {Q_SIZE = 10}; private: // private representation to be developed later public:
Queue(int qs = Q_SIZE); // create queue with a qs limit~Queue();bool isempty() const;bool isfull() const;int queuecount() const;bool enqueue(const Item &item); // add item to endbool dequeue(Item &item); // remove item from front
};
![Page 79: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/79.jpg)
79
OOP: Classes and objects
Programming task [Prata] class Queue { private: // class scope definitions
// Node is a nested structure definition local to this classstruct Node { Item item; struct Node * next;};enum {Q_SIZE = 10};
// private class membersNode * front; // pointer to front of QueueNode * rear; // pointer to rear of Queueint items; // current number of items in Queueconst int qsize; // maximum number of items in Queue
};
![Page 80: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/80.jpg)
80
Module 3
Object-Oriented Programming
Advanced Class Features
![Page 81: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/81.jpg)
81
OOP: Advanced class features
Content
– Inline functions
– Stack vs. Heap
– Array of objects vs. array of pointers
– Passing function arguments
– Static members
– Friend functions, friend classes
– Nested classes
– Move semantics (C++11)
![Page 82: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/82.jpg)
82
OOP: Advanced class features
Inline functions
– designed to speed up programs (like macros)
– the compiler replaces the function call with the function code (no function call!)
– advantage: speed
– disadvantage: code bloat ● ex. 10 function calls → 10 * function's size
![Page 83: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/83.jpg)
83
OOP: Advanced class features
How to make a function inline?
– use the inline keyword either in function declaration or in function definition
– both member and standalone functions can be inline
– common practice:● place the implementation of the inline function
into the header file– only small functions are eligible as inline
– the compiler may completely ignore your request
![Page 84: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/84.jpg)
84
OOP: Advanced class features
inline function examples
inline double square(double a){ return a * a;
}
class Value{ int value; public: inline int getValue()const{ return value; }
inline void setValue( int value ){this->value = value;
} };
![Page 85: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/85.jpg)
85
OOP: Advanced class features– Stack vs. Heap
– Heap – Dynamic allocation
– Stack – Automatic allocation
void draw(){Point * p = new Point();p->move(3,3);//...delete p;
}
void draw(){Point p;p.move(6,6);//...
}
![Page 86: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/86.jpg)
86
OOP: Advanced class features
Array of objects class Point{
int x, y; public:
Point( int x=0, int y=0); //...
};
:Point :Point :Point :Point
x: 0y: 0
x: 0y: 0
x: 0y: 0
x: 0y: 0
Point * t1 = new Point[ 4];
t1
Point t1[ 4];
What is the difference between these two arrays?
![Page 87: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/87.jpg)
87
OOP: Advanced class features
Array of pointers Point ** t2 = new Point*[ 4 ]; for(int i=0; i<4; ++i ){ t2[i] = new Point(0,0); } for( int i=0; i<4; ++i ){ cout<<*t2[ i ]<<endl; }
t2
:Point
x: 0y: 0
:Point
x: 0y: 0
:Point
x: 0y: 0
:Point
x: 0y: 0
![Page 88: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/88.jpg)
88
OOP: Advanced class features
Static members:
● static methods● static data
– Functions belonging to a class scope which don't access object's data can be static
– Static methods can't be const methods (they do not access object's state)
– They are not called on specific objects they have no this pointer
![Page 89: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/89.jpg)
89
OOP: Advanced class features– Static members
//Complex.hclass Complex{public: Complex(int re=0, int im=0);
static int getNumComplex();// ...
private: static int num_complex; double re, im;};
//Complex.cpp
int Complex::num_complex = 0;
int Complex::getNumComplex(){return num_complex;
}
Complex::Complex(int re, int im){ this->re = re;
this->im = im;++num_complex;
}
initializing static class member
instance counter
![Page 90: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/90.jpg)
90
OOP: Advanced class features– Static method invocation
Complex z1(1,2), z2(2,3), z3;cout<<"Number of complexs:"<<Complex::getNumComplex()<<endl;
cout<<"Number of complexes: "<<z1.getNumComplex()<<endl;
elegant
non - elegant
![Page 91: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/91.jpg)
91
OOP: Advanced class features
Complex z1(1,2), z2(2,3), z3;
re: 1im: 2
re: 2im: 3
re: 0im: 0
num_complex: 3
Each object has its own re and im
Only one copy ofthe static member
![Page 92: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/92.jpg)
92
OOP: Advanced class features– Classes vs. Structs
● default access specifier– class: private– struct: public
● class: data + methods, can be used polimorphically● struct: mostly data + convenience methods
![Page 93: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/93.jpg)
93
OOP: Advanced class features– Classes vs. structures
class list{
private:
struct node
{
node *next;
int val;
node( int val = 0, node * next = nullptr):val(val), next(next){}
};
node * mHead;
public:
list ();
~list ();
void insert (int a);
void printAll()const;
};
![Page 94: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/94.jpg)
94
OOP: Advanced class features– Passing function arguments
● by value – the function works on a copy of the variable
● by reference– the function works on the original variable, may modify it
● by constant reference– the function works on the original variable, may not modify
(verified by the compiler)
![Page 95: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/95.jpg)
95
OOP: Advanced class features– Passing function arguments
void f1(int x) {x = x + 1;}void f2(int& x) {x = x + 1;}void f3(const int& x) {x = x + 1;}//!!!!void f4(int *x) {*x = *x + 1;}int main(){int y = 5;f1(y);f2(y);f3(y);f4(&y);return 0;
}
passing primitive values
![Page 96: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/96.jpg)
96
OOP: Advanced class features– Passing function arguments
void f1(Point p);void f2(Point& p);void f3(const Point& p);void f4(Point *p); int main(){Point p1(3,3);f1(p1);f2(p1);f3(p1);f4(&p1);return 0;
}
passing objects
copy constructor will be used on the argument
only const methods of the class can be invoked on this argument
![Page 97: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/97.jpg)
97
OOP: Advanced class features– friend functions, friend classes, friend member
functions● friends are allowed to access private members of a class● Use it rarely
– operator overloading
![Page 98: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/98.jpg)
98
OOP: Advanced class features– friend vs. static functions
class Test{private: int iValue; static int sValue;public: Test( int in ):iValue( in ){} void print() const; static void print( const Test& what ); friend void print( const Test& what );};
![Page 99: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/99.jpg)
99
OOP: Advanced class features– friend vs. static functions
int Test :: sValue = 0;
void Test::print() const{ cout<<"Member: "<<iValue<<endl;}
void Test::print( const Test& what ){ cout<<"Static: "<<what.iValue<<endl;}
void print( const Test& what ){ cout<<"Friend: "<<what.iValue<<endl;}
int main() { Test test( 10 ); test.print(); Test::print( test ); print( test );}
![Page 100: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/100.jpg)
100
OOP: Advanced class features– friend class vs. friend member function
class List{private:
ListElement * head;public:
bool find( int key );…
};
class ListElement{private:
int key;ListElement * next;friend class List;...
};
class ListElement{private:
int key;ListElement * next;friend class List::find( int key);...
};
![Page 101: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/101.jpg)
101
OOP: Advanced class features– Returning a reference to a const object
// version 1 vector<int> Max(const vector<int> & v1, const vector<int> & v2) { if (v1.size() > v2.size()) return v1; else return v2;}
// version 2 const vector<int> & Max(const vector<int> & v1, const vector<int> & v2) { if (v1.size() > v2.size())
return v1;else
return v2; }
Copyconstructorinvocation
Moreefficient
The reference should be to a non-local object
C++03
![Page 102: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/102.jpg)
102
OOP: Advanced class features– Returning a reference to a const object
vector<int> selectOdd( const vector<int>& v){ vector<int> odds; for( int a: v ){ if (a % 2 == 1 ){ odds.push_back( a ); } } return odds; }
//... vector<int> v(N); for( int i=0; i<N; ++i){ v.push_back( rand()% M); } vector<int> result = selectOdd( v );
EFFICIENT!MOVE
constructorinvocation
C++11
![Page 103: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/103.jpg)
103
OOP: Advanced class features– Nested classes
● the class declared within another class is called a nested class
● usually helper classes are declared as nested
// Version 1
class Queue{ private: // class scope definitions
// Node is a nested structure definition local to this classstruct Node {Item item; struct Node * next;};...
};
![Page 104: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/104.jpg)
104
OOP: Advanced class features– Nested classes [Prata]
// Version 2
class Queue{
// class scope definitions// Node is a nested class definition local to this classclass Node{public:
Item item;Node * next;Node(const Item & i) : item(i), next(0) { }
};//...
};
Node visibility!!!
![Page 105: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/105.jpg)
105
OOP: Advanced class features– Nested classes
● a nested class B declared in a private section of a class A:
– B is local to class A (only class A can use it)
● a nested class B declared in a protected section of a class A:
– B can be used both in A and in the derived classes of A
● a nested class B declared in a public section of a class A:
– B is available to the outside world ( A :: B b;)
![Page 106: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/106.jpg)
106
OOP: Advanced class features– Features of a well-behaved C++ class
– implicit constructor● T :: T(){ … }
– destructor ● T :: ~T(){ … }
– copy constructor● T :: T( const T& ){ … }
– assignment operator (see next module)● T& T :: operator=( const T& ){ … }
![Page 107: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/107.jpg)
107
OOP: Advanced class features– Constructor delegation (C++11)
// C++03class A{ void init() { std::cout << "init()"; } void doSomethingElse() { std::cout << "doSomethingElse()\n"; }public: A() { init(); } A(int a) { init(); doSomethingElse(); }};
// C++11class A{ void doSomethingElse() { std::cout << "doSomethingElse()\n"; }public: A() { ... } A(int a) : A() { doSomethingElse(); }};
![Page 108: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/108.jpg)
108
OOP: Advanced class features– Lvalues:
● Refer to objects accessible at more than one point in a source code
– Named objects– Objects accessible via pointers/references
● Lvalues may not be moved from
– Rvalues:● Refer to objects accessible at exactly one point in source code
– Temporary objects (e.g. by value function return)● Rvalues may be moved from
![Page 109: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/109.jpg)
109
OOP: Advanced class features
– Lvalue int x; x = 10; Rvalue
![Page 110: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/110.jpg)
110
OOP: Advanced class features– Move Semantics (C++11)
class string{char* data;
public: string( const char* ); string( const string& ); ~string();};
string :: string(const char* p){size_t size = strlen(p) + 1;data = new char[size];memcpy(data, p, size);
}string :: string(const string& that){
size_t size = strlen(that.data) + 1; data = new char[size]; memcpy(data, that.data, size);}
string :: ~string(){delete[] data;
}
![Page 111: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/111.jpg)
111
OOP: Advanced class features– Move Semantics (C++11): lvalue, rvalue
string a(x); // Line 1
string b(x + y); // Line 2
string c(function_returning_a_string()); // Line 3
– lvalue: real object having an address
● Line 1: x
– rvalue: temporary object – no name
● Line 2: x + y
● Line 3: function_returning_a_string()
![Page 112: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/112.jpg)
112
OOP: Advanced class features– Move Semantics (C++11): rvalue reference, move
constructor
//string&& is an rvalue reference to a stringstring :: string(string&& that){
data = that.data;that.data = nullptr;
}
● Move constructor● Shallow copy of the argument ● Ownership transfer to the new
object
![Page 113: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/113.jpg)
113
OOP: Advanced class features– Move constructor – Stack classStack::Stack(Stack&& rhs){ //move rhs to this
this->mCapacity = rhs.mCapacity; this->mTop = rhs.mTop; this->mElements = rhs.mElements; //leave rhs in valid state rhs.mElements = nullptr; rhs.mCapacity = 0;
rhs.mTop = 0; }
![Page 114: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/114.jpg)
114
OOP: Advanced class features– Copy constructor vs. move constructor
● Copy constructor: deep copy● Move constructor: shallow copy + ownership transfer
// constructorstring s=”apple”;// copy constructor: s is an lvaluestring s1 = s; // move constructor: right side is an rvaluestring s2 = s + s1;
![Page 115: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/115.jpg)
115
OOP: Advanced class features– Passing large objects
–
–
–
–
– All STL classes have been extended to support move semantics
– The content of the temporary created vector is moved in v (not copied)
// C++98// avoid expense copying
void makeBigVector(vector<int>& out){ ...}vector<int> v;makeBigVector( v );
// C++11// move semantics
vector<int> makeBigVector(){ …}auto v = makeBigVector();
![Page 116: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/116.jpg)
116
OOP: Advanced class features
class A{int value {10};static A instance;
public:static A& getInstance(){ return instance;}static A getInstanceCopy(){ return instance;}int getValue() const { return value;}void setValue( int value ){ this->value = value;}
};
A A::instance;int main(){
A& v1 = A::getInstance();cout<<"v1: "<<v1.getValue()<<endl;v1.setValue(20);cout<<"v1: "<<v1.getValue()<<endl;A v2 = A::getInstanceCopy();cout<<"v2: "<<v2.getValue()<<endl;return 0;
}
http://geant4.web.cern.ch/geant4/collaboration/c++11_guidelines.pdf
Reference to a static variable → lvalue
A temporary copy of instance → rvalue
Output?
![Page 117: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/117.jpg)
117
Module 4
Object-Oriented Programming
Operator overloading
![Page 118: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/118.jpg)
118
OOP: Operator overloading
Content● Objectives● Types of operators● Operators
– Arithmetic operators– Increment/decrement– Inserter/extractor operators– Assignment operator (copy and move)– Index operator– Relational and equality operators– Conversion operators
![Page 119: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/119.jpg)
119
OOP: Operator overloading
Objective
– To make the class usage easier, more intuitive● the ability to read an object using the extractor operator (>>)
– Employee e1; cin >> e;● the ability to write an object using the inserter operator (<<)
– Employee e2; cout<<e<<endl;● the ability to compare objects of a given class
– cout<< ((e1 < e2) ? "less" : "greater");
Operator overloading: a service to the clients of the class
![Page 120: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/120.jpg)
120
OOP: Operator overloading
Limitations– You cannot add new operator symbols. Only the existing operators can
be redefined.
– Some operators cannot be overloaded:● . (member access in an object)
● ::(scope resolution operator)
● sizeof
● ?:
– You cannot change the arity (the number of arguments) of the operator
– You cannot change the precedence or associativity of the operator
![Page 121: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/121.jpg)
121
OOP: Operator overloading
How to implement?
– write a function with the name operator<symbol>
– alternatives:● method of your class● global function (usually a friend of the class)
http://en.cppreference.com/w/cpp/language/operators
![Page 122: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/122.jpg)
122
OOP: Operator overloading– There are 3 types of operators:
● operators that must be methods (member functions)– they don't make sense outside of a class:
● operator=, operator(),operator[], operator-> ● operators that must be global functions
– the left-hand side of the operator is a variable of different type than your class: operator<<, operator>>
● cout << emp; ● cout: ostream● emp: Employee
● operators that can be either methods or global functions
– Gregoire: “Make every operator a method unless you must make it a global function.”
![Page 123: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/123.jpg)
123
OOP: Operator overloading– Choosing argument types:
● value vs. reference– Prefer passing-by-reference instead of passing-by-value.
● const vs. non const
– Prefer const unless you modify it.
– Choosing return types● you can specify any return type, however
– follow the built-in types rule:● comparison always return bool● arithmetic operators return an object representing the result of the
arithmetic
![Page 124: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/124.jpg)
124
OOP: Operator overloading#ifndef COMPLEX_H#define COMPLEX_H
class Complex{public:
Complex(double, double );void setRe( double );void setIm( double im);double getRe() const;double getIm() const;void print() const;
private:double re, im;
};#endif
![Page 125: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/125.jpg)
125
OOP: Operator overloading#include "Complex.h"#include <iostream>using namespace std;
Complex::Complex(double re, double im):re( re),im(im) {}
void Complex::setRe( double re){this->re = re;}
void Complex::setIm( double im){ this->im = im;} double Complex::getRe() const{ return this->re;} double Complex::getIm() const{ return this->im;}
void Complex::print()const{ cout<<re<<"+"<<im<<"i";}
![Page 126: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/126.jpg)
126
OOP: Operator overloading– Arithmetic operators (member or standalone func.)
● unary minus● binary minus
Complex Complex::operator-() const{ Complex temp(-this->re, -this->im); return temp;}
Complex Complex::operator-( const Complex& z) const{ Complex temp(this->re - z.re, this->im- z.im); return temp;}
![Page 127: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/127.jpg)
127
OOP: Operator overloading– Arithmetic operators (member or standalone func.)
● unary minus● binary minus
Complex operator-( const Complex& z ){ Complex temp(-z.getRe(), -z.getIm()); return temp;}
Complex operator-( const Complex& z1, const Complex& z2 ){ Complex temp(z1.getRe()-z2.getRe(), z1.getIm()-z2.getIm()); return temp;}
![Page 128: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/128.jpg)
128
OOP: Operator overloading– Increment/Decrement operators
● postincrement:
– int i = 10; int j = i++; // j → 10● preincrement:
– int i = 10; int j = ++i; // j → 11● The C++ standard specifies that the prefix increment and decrement
return an lvalue (left value).
![Page 129: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/129.jpg)
129
OOP: Operator overloading– Increment/Decrement operators (member func.)
Complex& Complex::operator++(){ //prefix (this->re)++; (this->im)++; return *this;} Complex Complex::operator++( int ){ //postfix Complex temp(*this); (this->re)++; (this->im)++; return temp;}
Which one is more efficient? Why?
![Page 130: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/130.jpg)
130
OOP: Operator overloading– Inserter/Extractor operators (standalone func.)
//complex.h
class Complex {public: friend ostream& operator<<(
ostream& os, const Complex& c); friend istream& operator>>(
istream& is, Complex& c); //...};
![Page 131: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/131.jpg)
131
OOP: Operator overloading– Inserter/Extractor operators (standalone func.)
//complex.cpp
ostream& operator<<( ostream& os, const Complex& c){ os<<c.re<<"+"<<c.im<<"i"; return os;}
istream& operator>>( istream& is, Complex& c){ is>>c.re>>c.im; return is;}
![Page 132: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/132.jpg)
132
OOP: Operator overloading– Inserter/Extractor operators
– Syntax: ostream& operator<<( ostream& os, const T& out)
istream& operator>>( istream& is, T& in)
– Remarks:● Streams are always passed by reference● Q: Why should inserter operator return an ostream&?● Q: Why should extractor operator return an istream&?
![Page 133: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/133.jpg)
133
OOP: Operator overloading– Inserter/Extractor operators– Usage:
Complex z1, z2;cout<<"Read 2 complex number:";//Extractorcin>>z1>>z2;//Insertercout<<"z1: "<<z1<<endl;cout<<"z2: "<<z2<<endl; cout<<"z1++: "<<(z1++)<<endl;cout<<"++z2: "<<(++z2)<<endl;
![Page 134: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/134.jpg)
134
OOP: Operator overloading– Assignment operator (=)
● Q: When should be overloaded?● A: When bitwise copy is not satisfactory (e.g. if you have
dynamically allocated memory – when we should implement the copy constructor and the
destructor too). – Ex. our Stack class
![Page 135: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/135.jpg)
135
OOP: Operator overloading– Assignment operator (member func.)
● Copy assignment● Move assignment (since C++11)
![Page 136: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/136.jpg)
136
OOP: Operator overloading– Copy assignment operator (member func.)
● Syntax: X& operator=( const X& rhs);● Q: Is the return type necessary?
– Analyze the following example code
Complex z1(1,2), z2(2,3), z3(1,1);z3 = z1;z2 = z1 = z3;
![Page 137: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/137.jpg)
137
OOP: Operator overloading– Copy assignment operator example
Stack& Stack::operator=(const Stack& rhs) { if (this != &rhs) { //delete lhs – left hand side delete [] this->mElements;
this->mCapacity = 0;this_>melements = nullptr; // in case next line throws
//copy rhs – right hand side this->mCapacity = rhs.mCapacity; this->mElements = new double[ mCapacity ]; int nr = rhs.mTop - rhs.mElements; std::copy(rhs.mElements,rhs.mElements+nr,this->mElements); mTop = mElements + nr; } return *this;}
![Page 138: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/138.jpg)
138
OOP: Operator overloading– Copy assignment operator vs Copy constructor
Complex z1(1,2), z2(3,4); //ConstructorComplex z3 = z1; //Copy constructorComplex z4(z2); //Copy constructorz1 = z2; //Copy assignment operator
![Page 139: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/139.jpg)
139
OOP: Operator overloading– Move assignment operator (member func.)
● Syntax: X& operator=( X&& rhs);● When it is called?
Complex z1(1,2), z2(3,4); //ConstructorComplex z4(z2); //Copy constructorz1 = z2; //Copy assignment operatorComplex z3 = z1 + z2; //Move constructorz3 = z1 + z1; //Move assignment
![Page 140: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/140.jpg)
140
OOP: Operator overloading– Move assignment operator exampleStack& Stack::operator=(Stack&& rhs){ //delete lhs – left hand side delete [] this->mElements;
//move rhs to this this->mCapacity = rhs.mCapacity;
this->mTop = rhs.mTop; this->mElements = rhs.mElements; //leave rhs in valid state rhs.mElements = nullptr; rhs.mCapacity = 0;
rhs.mTop = 0; //return permits s1 = s2 = create_stack(4); return *this;}
![Page 141: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/141.jpg)
141
OOP: Advanced class features– Features of a well-behaved C++ class (2011)
● implicit constructor T :: T();● destructor T :: ~T();● copy constructor T :: T( const T& );● move constructor T :: T( T&& );● copy assignment operator
● T& T :: operator=( const T& );● move assignment operator
● T& T :: operator=( T&& rhs );
![Page 142: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/142.jpg)
142
OOP: Operator overloading– Subscript operator: needed for arrays (member func.)
– Suppose you want your own dynamically allocated C-style array implement your own CArray
#ifndef CARRAY_H#define CARRAY_Hclass CArray{public: CArray( int size = 10 ); ~CArray(); CArray( const CArray&) = delete; CArray& operator=( const Carray&) = delete; double& operator[]( int index ); double operator[]( int index ) const;private: double * mElems; int mSize;};#endif /* ARRAY_H */`
Provides read-only access
“If the value type is known to be a built-in type, the const variant should return by value.”http://en.cppreference.com/w/cpp/language/operators.
![Page 143: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/143.jpg)
143
OOP: Operator overloading– Implementation
CArray::CArray( int size ){ if( size < 0 ){ this->size = 10; } this->mSize = size; this->mElems = new double[ mSize ];}
CArray::~CArray(){ if( mElems != nullptr ){ delete[] mElems;
mElems = nullptr; }}
double& CArray::operator[]( int index ){ if( index <0 || index >= mSize ){ throw out_of_range(""); } return mElems[ index ];}
#include<stdexcept>
double CArray::operator[]( int index ) const{ if( index <0 || index >= mSize ){ throw out_of_range(""); } return mElems[ index ];}
![Page 144: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/144.jpg)
144
OOP: Operator overloading– const vs non-const [] operator
void printArray(const CArray& arr, size_t size) { for (size_t i = 0; i < size; i++) { cout << arr[i] << "" ; // Calls the const operator[] because arr is // a const object. } cout << endl;}
CArray myArray; for (size_t i = 0; i < 10; i++) { myArray[i] = 100; // Calls the non-const operator[] because // myArray is a non-const object. } printArray(myArray, 10);
![Page 145: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/145.jpg)
145
OOP: Operator overloading– Relational and equality operators
● used for search and sort● the container must be able to compare the stored objects
bool operator ==( const Point& p1, const Point& p2){ return p1.getX() == p2.getX() && p1.getY() == p2.getY(); }
bool operator <( const Point& p1, const Point& p2){ return p1.distance(Point(0,0)) < p2.distance(Point(0,0)); }
set<Point> p;vector<Point> v; //...sort(v.begin(), v.end());
![Page 146: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/146.jpg)
146
OOP: Operator overloading– The function call operator ()
– Instances of classes overloading this operator behave as functions too (they are function objects = function + object)
#ifndef ADDVALUE_H#define ADDVALUE_Hclass AddValue{ int value;public: AddValue( int inValue = 1); void operator()( int& what ); };#endif /* ADDVALUE_H */
#include "AddValue.h"
AddValue::AddValue( int inValue ){ this->value = inValue;}void AddValue::operator()( int& what ){ what += this->value;}
![Page 147: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/147.jpg)
147
OOP: Operator overloading– The function call operator
AddValue func(2); int array[]={1, 2, 3}; for( int& x : array ){ func(x); } for( int x: array ){ cout <<x<<endl; }
![Page 148: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/148.jpg)
148
OOP: Operator overloading– Function call operator
● used frequently for defining sorting criterion
struct EmployeeCompare{ bool operator()( const Employee& e1, const Employee& e2){ if( e1.getLastName() == e2.getLastName()) return e1.getFirstName() < e2.getFirstName(); else return e1.getLastName() < e2.getLastName(); }};
![Page 149: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/149.jpg)
149
OOP: Operator overloading– Function call operator
● sorted container set<Employee, EmployeeCompare> s; Employee e1; e1.setFirstName("Barbara"); e1.setLastName("Liskov"); Employee e2; e2.setFirstName("John"); e2.setLastName("Steinbeck"); Employee e3; e3.setFirstName("Andrew"); e3.setLastName("Foyle"); s.insert( e1 ); s.insert( e2 ); s.insert( e3 ); for( auto& emp : s){ emp.display(); }
![Page 150: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/150.jpg)
150
OOP: Operator overloading– Sorting elements of a given type:
● A. override operators: <, ==● B. define a function object containing the comparison
– Which one to use?● Q: How many sorted criteria can be defined using method A?● Q: How many sorted criteria can be defined using method B?
![Page 151: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/151.jpg)
151
OOP: Operator overloading– Writing conversion operators
class Complex{ public: operator string() const; // };
Complex::operator string() const{ stringstream ss; ss<<this->re<<"+"<<this->im<<"i"; return ss.str(); }
//usage Complex z(1, 2); string a = z; cout<<a<<endl;
![Page 152: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/152.jpg)
152
OOP: Operator overloading– After templates
● Overloading operator *● Overloading operator →
![Page 153: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/153.jpg)
153
OOP: Review– Find all possible errors or shortcommings!
(1) class Array {(2) public: (3) Array (int n) : rep_(new int [n]) { }(4) Array (Array& rhs) : rep_(rhs.rep_) { }(5) ~Array () { delete rep_; }(6) Array& operator = (Array rhs) { rep_= rhs.rep_; }(7) int& operator [] (int n) { return &rep_[n]; }(8) private: (9) int * rep_; (10) }; // Array
Source: http://www.cs.helsinki.fi/u/vihavain/k13/gea/exer/exer_2.html
![Page 154: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/154.jpg)
154
Solution required!– It is given the following program!
#include <iostream>
int main(){std::cout<<”Hello\n”;return 0;
}
Modify the program without modifying the main function so that the output of the program would be:
StartHelloStop
![Page 155: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/155.jpg)
155
Singleton Design Pattern#include <string>class Logger{public:
static Logger* Instance();bool openLogFile(std::string logFile);void writeToLogFile();bool closeLogFile();
private:Logger(){}; // Private so that it can not be calledLogger(Logger const&){}; // copy constructor is privateLogger& operator=(Logger const&){};// assignment operator is privatestatic Logger* m_pInstance;
};
http://www.yolinux.com/TUTORIALS/C++Singleton.html
![Page 156: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/156.jpg)
156
Singleton Design Pattern
class Framewor...
Singleton
- uniqueInstance- singletonData
+ Instance()return uniqueInstance
+ SingletonOperation()+ GetSingletonData()
static
static● Ensure that only one instance of a class is created.
● Provide a global point of access to the object.
![Page 157: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/157.jpg)
157
Module 5
Object-Oriented Programming
Public Inheritance
![Page 158: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/158.jpg)
158
OOP: Inheritance– Inheritance
● is-a relationship - public inheritance● protected access● virtual member function● early (static) binding vs. late (dynamic) binding● abstract base classes● pure virtual functions● virtual destructor
![Page 159: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/159.jpg)
159
OOP: Inheritance– public inheritance
● is-a relationship● base class: Employee● derived class: Manager
– You can do with inheritance● add data
– ex. department
● add functionality – ex. getDepartment(), setDepartment()
● modify methods' behavior – ex. print()
class cppinheritance
Employee
- fi rstNam e: string- lastNam e: string- salary: double
+ Em ployee(string, string, double)+ getFi rstNam e() : string {query}+ setFirstNam e(string) : void+ getLastNam e() : string {query}+ setLastNam e(string) : void+ getSalary() : double {query}+ setSalary(double) : void+ print(ostream&) : void {query}
Manager
- departm ent: string
+ M anager()+ M anager(string, string, double, string)+ setDepartm ent(string) : void+ getDepartm ent() : string {query}+ print(ostream &) : void {query}
![Page 160: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/160.jpg)
160
OOP: Inheritance– protected access
● base class's private members can not be accessed in a derived class
● base class's protected members can be accessed in a derived class
● base class's public members can be accessed from anywhere
![Page 161: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/161.jpg)
161
OOP: Inheritance– public inheritanceclass Employee{public:
Employee(string firstName = "", string lastName = "", double salary = 0.0) : firstName(firstName),
lastName(lastName), salary(salary) {
}//...
};
class Manager:public Employee{ string department;public: Manager(); Manager( string firstName, string lastName, double salary,
string department ); //...};
![Page 162: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/162.jpg)
162
OOP: Inheritance– Derived class's constructors
Manager::Manager(){}
Employee's constructor invocation → Default constructor can be invoked implicitly
![Page 163: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/163.jpg)
163
OOP: Inheritance– Derived class's constructors
Manager::Manager(){}
Manager::Manager(string firstName, string lastName, double salary, string department): Employee(firstName, lastName, salary), department(department){}
Employee's constructor invocation → Default constructor can be invoked implicitly
base class's constructor invocation – constructor initializer listarguments for the base class's constructor are specified in the definition of a derived class's constructor
![Page 164: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/164.jpg)
164
OOP: Inheritance– How are derived class's objects constructed?
● bottom up order:– base class constructor invocation– member initialization– derived class's constructor block
● destruction– in the opposite order
Employee
Manager
![Page 165: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/165.jpg)
165
OOP: Inheritance– Method overriding
class Employee {public: virtual void print( ostream&) const;};
class Manager:public Employee{public: virtual void print(ostream&) const;};
class Employee {public: virtual void print( ostream&) const;};
class Employee{public: virtual void print(ostream&) const;};
![Page 166: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/166.jpg)
166
OOP: Inheritance– Method overriding
class Employee {public: virtual void print( ostream&) const;};
void Manager::print(ostream& os) const{ Employee::print(os); os<<" "<<department;}
class Employee {public: virtual void print( ostream&) const;};
void Employee::print(ostream& os ) const{ os<<this->firstName<<" "<<this->lastName<<" "<<this->salary;}
class Manager:public Employee{public: virtual void print(ostream&) const;};
![Page 167: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/167.jpg)
167
OOP: Inheritance– Method overriding - virtual functions
● non virtual functions are bound statically– compile time
● virtual functions are bound dynamically– run time
![Page 168: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/168.jpg)
168
OOP: Inheritance– Polymorphism
void printAll( const vector<Employee*>& emps ){ for( int i=0; i<emps.size(); ++i){ emps[i]-> print(cout); cout<<endl; }}
int main(int argc, char** argv) { vector<Employee*> v; Employee e("John", "Smith", 1000); v.push_back(&e); Manager m("Sarah", "Parker", 2000, "Sales"); v.push_back(&m); cout<<endl; printAll( v ); return 0;}
Output:John Smith 1000Sarah Parker 2000 Sales
![Page 169: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/169.jpg)
169
OOP: Inheritance– Polymorphism
● a type with virtual functions is called a polymorphic type● polymorphic behavior preconditions:
– the member function must be virtual– objects must be manipulated through
● pointers or ● references
– Employee :: print( os ) static binding – no polymorphism
![Page 170: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/170.jpg)
170
OOP: Inheritance– Polymorphism – Virtual Function Table
class Employee{public: virtual void print(ostream&) const;
//...};
class Manager:public Employee{ virtual void print(ostream&) const;
//...};Employee e1, e2;Manager m1, m2;
firstName:””lastName:””salary:0.0
firstName:””lastName:””salary:0.0
e1
e2
Employee::print
Manager::print
firstName:””lastName:””salary:0.0departmentvtbl
firstName:”” lastName:”” salary:0.0 department
firstName:”” lastName:”” salary:0.0 department
m1
m2
vptr
vptr
vptr
vptr
Discussion!!!Employee * pe;pe = &e1; pe->print();//???pe = &m2; pe->print();//???
vtbl:
vtbl:
Each class with virtual functions has its own virtual function table (vtbl).
![Page 171: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/171.jpg)
171
RTTI – Run-Time Type Information
dynamic_cast<>(pointer) class Base{}; class Derived : public Base{};
Base* basePointer = new Derived(); Derived* derivedPointer = nullptr; //To find whether basePointer is pointing to Derived type of object
derivedPointer = dynamic_cast<Derived*>(basePointer); if (derivedPointer != nullptr){ cout << "basePointer is pointing to a Derived class object"; }else{ cout << "basePointer is NOT pointing to a Derived class object"; }
Java:instanceof
![Page 172: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/172.jpg)
172
RTTI – Run-Time Type Information
dynamic_cast<>(reference) class Base{}; class Derived : public Base{};
Derived derived; Base& baseRef = derived;
// If the operand of a dynamic_cast to a reference isn’t of the expected type, // a bad_cast exception is thrown. try{ Derived& derivedRef = dynamic_cast<Derived&>(baseRef); } catch( bad_cast ){ // .. }
![Page 173: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/173.jpg)
173
OOP: Inheritance– Abstract classes
● used for representing abstract concepts● used as base class for other classes● no instances can be created
![Page 174: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/174.jpg)
174
OOP: Inheritance– Abstract classes – pure virtual functions
class Shape{ // abstract classpublic:
virtual void rotate(int) = 0; // pure virtual functionvirtual void draw() = 0; // pure virtual function// ...
};
Shape s; //???
![Page 175: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/175.jpg)
175
OOP: Inheritance– Abstract classes – pure virtual functions
class Shape{ // abstract classpublic:
virtual void rotate(int) = 0; // pure virtual functionvirtual void draw() = 0; // pure virtual function// ...
};
Shape s; //Compiler error
![Page 176: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/176.jpg)
176
OOP: Inheritance– Abstract class → concrete class
class Point{ /* ... */ };class Circle : public Shape {public:
void rotate(int); // override Shape::rotatevoid draw(); // override Shape::drawCircle(Point p, int r) ;
private:Point center;int radius;
};
![Page 177: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/177.jpg)
177
OOP: Inheritance– Abstract class → abstract class
class Polygon : public Shape{ public:// draw() and rotate() are not overridden
};
Polygon p; //Compiler error
![Page 178: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/178.jpg)
178
OOP: Inheritance– Virtual destructor
● Every class having at least one virtual function should have virtual destructor. Why?
class X{public:
// ...virtual ~X();
};
![Page 179: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/179.jpg)
179
OOP: Inheritance– Virtual destructor
void deleteAll( Employee ** emps, int size){ for( int i=0; i<size; ++i){ delete emps[ i ]; } delete [] emps;}
// main Employee ** t = new Employee *[ 10 ]; for(int i=0; i<10; ++i){ if( i % 2 == 0 )
t[ i ] = new Employee(); else
t[ i ] = new Manager(); } deleteAll( t, 10);
Which destructor is invoked?
![Page 180: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/180.jpg)
180
Module 6
Object-Oriented Programming
Object relationships
![Page 181: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/181.jpg)
181
OOP: Object relationships– Content
● The is-a relationship ● The has-a relationship● Private inheritance● Multiple inheritance
![Page 182: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/182.jpg)
182
OOP: Object relationships– The is-a relationship – Client's view (1)
● works in only one direction:– every Sub object is also a Super one– but Super object is not a Sub
Super
Sub
void foo1( const Super& s );void foo2( const Sub& s);Super super;Sub sub;
foo1(super); //OKfoo1(sub); //OKfoo2(super); //NOT OKfoo2(sub); //OK
![Page 183: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/183.jpg)
183
OOP: Object relationships– The is-a relationship – Client's view (2)
class Super{public: virtual void method1();};class Sub : public Super{public: virtual void method2();};
Super * p= new Super();p->method1(); //OK
p = new Sub();p->method1(); //OKp->method2(); //NOT OK((Sub *)p)->method2();//OK
Super
Sub
![Page 184: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/184.jpg)
184
OOP: Object relationships– The is-a relationship – Sub-class’s view
● the Sub class augments the Super class by adding additional methods
● the Sub class may override the Super class methods● the subclass can use all the public and
protected members of a superclass.
Super
Sub
![Page 185: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/185.jpg)
185
OOP: Object relationships– The is-a relationship: preventing inheritance C++11
● final classes – cannot be extended
class Super final{
};
![Page 186: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/186.jpg)
186
OOP: Object relationships– The is-a relationship: a client's view of overridden methods(1)
● polymorphism
class Super{public:
virtual void method1();};class Sub : public Super{public:
virtual void method1();};
Super super;super.method1(); //Super::method1()
Sub sub;sub.method1(); //Sub::method1()
Super& ref =super;ref.method1(); //Super::method1();
ref = sub;ref.method1(); //Sub::method1();
Super* ptr =&super;ptr->method1(); //Super::method1();
ptr = ⊂ptr->method1(); //Sub::method1();
![Page 187: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/187.jpg)
187
OOP: Object relationships– The is-a relationship: a client's view of overridden methods(2)
● object slicing
class Super{public:
virtual void method1();};class Sub : public Super{public:
virtual void method1();};
Sub sub;Super super = sub;super.method1(); // Super::method1();
Sub
SuperSuper
super sub
![Page 188: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/188.jpg)
188
OOP: Object relationships– The is-a relationship: preventing method overriding C++11
class Super{public:
virtual void method1() final;};class Sub : public Super{public:
virtual void method1(); //ERROR};
![Page 189: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/189.jpg)
189
OOP: Object relationships– Inheritance for polymorphism
www.javatutorialhub.com
![Page 190: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/190.jpg)
190
OOP: Object relationships– The has-a relationship
ButtonWindow
![Page 191: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/191.jpg)
191
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B
class B;
class A{private:
B b;};
class B;
class A{private:
B& b;};
class B;
class A{private:
B* b;};
![Page 192: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/192.jpg)
192
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B– strong containment (composition)
class B;
class A{private:
B b;};
A anObject;
b: B
anObject: A
A B
![Page 193: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/193.jpg)
193
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B– weak containment (aggregation)
class B;
class A{private:
B& b;public:
A( const B& pb):b(pb){}};
B bObject;A aObject1(bObject);A aObject2(bObject);
aObject1: A
bObject: B
aObject2: A
A B
![Page 194: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/194.jpg)
194
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B
class B;
class A{private:
B* b;public:
A(){b = new B();
} ~A(){
delete b;}
};
class B;
class A{private:
B* b;public:
A( B* pb):b( pb ){}};
weak containment strong containment
![Page 195: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/195.jpg)
195
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B
Usage:B bObject;A aObject1(&bObject);A aObject2(&bObject);
class B;
class A{private:
B* b;public:
A( B* pb):b( pb ){}};
weak containment
aObject1: A
bObject: B
aObject2: A
A B
![Page 196: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/196.jpg)
196
OOP: Object relationships– Implementing the has-a relationship
● An object A has an object B
class B;
class A{private:
B* b;public:
A(){b = new B();
} ~A(){
delete b;}
};
strong containment
b: B *
anObject: A
Usage:A aObject;
A B
![Page 197: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/197.jpg)
197
OOP: Object relationships– Combining the is-a and the has-a relationships
class Class Mo...
Component
+ Operation()+ Add() : Component+ Rem ove() : Com ponent+ GetChi ld() : Com ponent
Client
Leaf
+ Operation()
Composite
+ Operation()fora l l g in chi ld ren g .Operation();
+ Add() : Com ponent+ Rem ove() : Com ponent+ GetChi ld() : Com ponent
-chi ld ren
1..*
![Page 198: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/198.jpg)
198
Composite Design Pattern class Class Mo...
Component
+ Opera tion()+ Add() : Component+ Rem ove() : Com ponent+ GetChi ld () : Com ponent
Client
Leaf
+ Operation()
Composite
+ Operation()fora l l g in ch i ldren g .Opera tion();
+ Add() : Com ponent+ Rem ove() : Com ponent+ GetChi ld() : Com ponent
-ch i ldren
1..*
● Compose objects into tree structures to represent part-whole hierarchies.
● Lets clients treat individual objects and composition of objects uniformly.
![Page 199: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/199.jpg)
199
Composite Design Pattern
● Examples:– Menu – MenuItem: Menus that contain menu items, each of which could
be a menu.– Container – Element: Containers that contain Elements, each of which
could be a Container.– GUI Container – GUI component: GUI containers that contain GUI
components, each of which could be a container
Source: http://www.oodesign.com/composite-pattern.html
![Page 200: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/200.jpg)
200
Private Inheritance
– another possibility for has-a relationship
Base class
Derived class
Base class
Derived class
publicinheritance
privateinheritance
public
public
public
private
Derived class inherits the base class behavior
Derived class hides the base class behavior
![Page 201: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/201.jpg)
201
Private Inheritancetemplate <typename T>class MyStack : private vector<T> {public: void push(T elem) { this->push_back(elem); } bool isEmpty() { return this->empty(); } void pop() { if (!this->empty())this->pop_back(); } T top() { if (this->empty()) throw out_of_range("Stack is empty"); else return this->back(); }};
Why is public inheritancein this case dangerous???
![Page 202: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/202.jpg)
202
Non-public Inheritance
– it is very rare;– use it cautiously;– most programmers are not familiar with it;
![Page 203: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/203.jpg)
203
What does it print?
class Super{public:
Super(){}virtual void someMethod(double d) const{
cout<<"Super"<<endl; }};class Sub : public Super{public:
Sub(){}virtual void someMethod(double d){
cout<<"Sub"<<endl; }};
Sub sub; Super super;Super& ref = sub;ref.someMethod(1);ref = super; ref.someMethod(1);
![Page 204: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/204.jpg)
204
What does it print?
class Super{public:
Super(){}virtual void someMethod(double d) const{
cout<<"Super"<<endl; }};class Sub : public Super{public:
Sub(){}virtual void someMethod(double d){
cout<<"Sub"<<endl; }};
Sub sub; Super super;Super& ref = sub;ref.someMethod(1);ref = super; ref.someMethod(1);
creates a new method, instead of overriding the method
![Page 205: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/205.jpg)
205
The override keyword C++11
class Super{public:
Super(){}virtual void someMethod(double d) const{
cout<<"Super"<<endl; }};class Sub : public Super{public:
Sub(){}virtual void someMethod(double d) const override{
cout<<"Sub"<<endl; }};
Sub sub; Super super;Super& ref = sub;ref.someMethod(1);ref = super; ref.someMethod(1);
![Page 206: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/206.jpg)
206
Module 7
Generic Programming: Templates
![Page 207: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/207.jpg)
207
Outline
– Templates● Class template● Function template● Template metaprogramming
![Page 208: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/208.jpg)
208
Templates
![Page 210: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/210.jpg)
210
Templates
– Allow generic programming● to write code that can work with all kind of objects
● template programmer's obligation: specify the requirements of the classes that define these objects
● template user's obligation: supplying those operators and methods that the template programmer requires
![Page 211: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/211.jpg)
211
Function Template
– Allows writing function familiestemplate<typename T>const T max(const T& x, const T& y) { return x < y ? y : x;}
template<class T>const T max(const T& x, const T& y) { return x < y ? y : x;}
Template parameter
● What are the requirements regarding the type T?
![Page 212: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/212.jpg)
212
Function Template
● Requirements regarding the type T:– less operator (<) – copy constructor
template<class T>const T max(const T& x, const T& y) { return x < y ? y : x;}
![Page 213: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/213.jpg)
213
Function Template
● Usage:– cout<<max(2, 3)<<endl; // max: T → int– string a(“alma”); string b(“korte”);
cout<<max(a, b)<<endl; // max: T → string– Person p1(“John”,”Kennedy”),p2(“Abraham”, “Lincoln”);
cout<<max(p1,p2)<<endl;// max: T-> Person
template<class T>const T max(const T& x, const T& y) { return x < y ? y : x;}
![Page 214: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/214.jpg)
214
Function Template
● Requirements regarding the type T:– copy constructor– assignment operator
template<class T>void swap(T& x, T& y) { const T tmp = x; x = y; y = tmp;}
![Page 215: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/215.jpg)
215
Function Template
– Allows writing function families● polymorphism: compile time
– How the compiler processes templates?– cout<<max(2, 3)<<endl; // max: T → int– cout<<max(2.5, 3.6)<<endl; // max: T → double–
– How many max functions?
Warning: Code bloat!
![Page 216: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/216.jpg)
216
Function Template– What does it do? [Gregoire]
static const size_t MAGIC = (size_t)(-1);template <typename T>size_t Foo(T& value, T* arr, size_t size){
for (size_t i = 0; i < size; i++) {if (arr[i] == value) {
return i; }
}return MAGIC;
}
![Page 217: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/217.jpg)
217
Class Template
– Allow writing class families
template<typename T>class Array { T* elements; int size;public: explicit Array(const int size); ...};
![Page 218: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/218.jpg)
218
Class Template
– Template class's method definitiontemplate<typename T>class Array { T* elements; int size;public: explicit Array(const int size); ...};template<typename T>Array<T>::Array(const int size):size(size), elements(new T[size]){}
![Page 219: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/219.jpg)
219
Class Template
– Template parameters● type template parameters● non-type template parameters
template<typename T>class Array { T* elements; int size;public: Array(const int size); ...};
template<class T, int MAX=100>class Stack{ T elements[ MAX ];public: ...};
![Page 220: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/220.jpg)
220
Class Template
– Distributing Template Code between Files● Normal class:
– Person.h → interface– Person.cpp → implementation
● Template class:– interface + implementation go in the same file e. g. Array.h
● it can be a .h file → usage: #include “Array.h”● it can be a .cpp file → usage: #include “Array.cpp”
![Page 221: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/221.jpg)
221
Class Template+ Function Templatetemplate<class T1, class T2>struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair(); pair(const T1& x, const T2& y); ...};
template< class T1, class T2>pair<T1, T2> make_pair(const T1& x, const T2& y){ return pair<T1, T2>(x, y);}
#include <utility>
![Page 222: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/222.jpg)
222
Advanced Template● template template parameter
template<typename T, typename Container>class Stack{
Container elements;public:
void push( const T& e ){ elements.push_back( e ); } ...};
Stack<int, vector<int> > v1;Stack<int, deque<int> > v2;
Usage:
![Page 223: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/223.jpg)
223
Advanced Template● template template parameter
template<typename T, typename Container=vector<T> >class Stack{
Container elements;public:
void push( const T& e ){ elements.push_back( e ); } ...};
![Page 224: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/224.jpg)
224
Advanced Template● What does it do?
template < typename Container >void foo( const Container& c, const char * str=""){ typename Container::const_iterator it; cout<<str; for(it = c.begin();it != c.end(); ++it) cout<<*it<<' '; cout<<endl;}
![Page 225: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/225.jpg)
225
Advanced Template● What does it do?
template < typename Container >void foo( const Container& c, const char * str=""){ typename Container::const_iterator it; cout<<str; for(auto& a: c ){ cout<< a <<' '; } cout<<endl;}
![Page 226: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/226.jpg)
226
Examples
Implement the following template functions!
template <typename T>bool linsearch( T* first, T* last, T what);
template <typename T>bool binarysearch( T* first, T* last, T what);
![Page 227: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/227.jpg)
227
More Advanced Template● Template Metaprogramming
template<unsigned int N> struct Fact{static const unsigned long int value = N * Fact<N-1>::value;};template<> struct Fact<0>{ static const unsigned long int value = 1;};// Fact<8> is computed at compile time:const unsigned long int fact_8 = Fact<8>::value;int main(){ cout << fact_8 << endl; return 0;}
![Page 228: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/228.jpg)
228
Module 8
STL – Standard Template Library
![Page 229: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/229.jpg)
229
Alexander Stepanov
https://www.sgi.com/tech/stl/drdobbs-interview.html
![Page 230: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/230.jpg)
230
Outline
– Containers– Algorithms– Iterators
![Page 231: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/231.jpg)
231
STL – General View
– library of reusable components– a support for C++ development– based on generic programming
![Page 232: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/232.jpg)
232
STL – General View
– Containers – Template Class● generalized data structures (you can use them for any
type)– Algorithms – Template Function
● generalized algorithms (you can use them for almost any data structure)
– Iterators – Glue between Containers and Algorithms● specifies a position into a container (generalized pointer)● permits traversal of the container
![Page 233: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/233.jpg)
233
Basic STL Containers
– Sequence containers● linear arrangement
– vector, deque, list– stack, queue, priority_queue
– Associative containers● provide fast retrieval of data based on keys
– set, multiset, map, multimap
<vector> <deque> <list>
<set> <map>
<stack> <queue>
<vector> <deque> <list>Container adapters
![Page 234: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/234.jpg)
234
Sequence Containers
![Page 235: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/235.jpg)
235
Associative Containers
![Page 236: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/236.jpg)
236
STL Containers C++11
– Sequence containers– array (C-style array)
– forward_list (singly linked list)
– Associative containers– unordered_set, unordered_multiset (hash table)
– unordered_map, unordered_multimap (hash table)
<array> <forward-list>
<unordered_set> <unordered_map>
<array> <forward_list>
![Page 237: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/237.jpg)
237
STL Containers
– homogeneous:● vector<Person>, vector<Person*>
– polymorphism● vector<Person*>
class Person{};class Employee: public Person{};class Manager : public Employee{};
![Page 238: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/238.jpg)
238
STL Containers
–Person Person Person
...
vector<Person>vector<Person>
homogenous
![Page 239: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/239.jpg)
239
STL Containers
–Person Person Person
Person Employee Manager
...
...
vector<Person>vector<Person>
vector<Person *>
homogenous
homogenous
heterogenous
![Page 240: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/240.jpg)
240
The vector container - constructors
vector<T> v; //empty vector
vector<T> v(n, value);//vector with n copies of value
vector<T> v(n);//vector with n copies of default for T
![Page 241: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/241.jpg)
241
The vector container – add new elements
vector<int> v;
for( int i=1; i<=5; ++i){v.push_back( i );
}
1 2 3 4 5
v.end()v.begin()
![Page 242: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/242.jpg)
242
The vector container
vector<int> v( 10 ); cout<<v.size()<<endl;//??? for( int i=0; i<v.size(); ++i ){cout<<v[ i ]<<endl;
}
for( int i=0; i<10; ++i){v.push_back( i );
}cout<<v.size()<<endl;//???
for( auto& a: v ){cout<< a <<” “;
}
![Page 243: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/243.jpg)
243
The vector container: typical errors
– Find the error and correct it!
vector<int> v;cout<<v.size()<<endl;//???for( int i=0; i<10; ++i ){
v[ i ] = i; }cout<<v.size()<<endl;//???for( int i=0; i<v.size(); ++i ){
cout<<v[ i ]<<endl; }
![Page 244: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/244.jpg)
244
The vector container: capacity and size
vector<int> v; v.reserve( 10 );
cout << v.size() << endl;//???cout << v.capacity() << endl;//???
![Page 245: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/245.jpg)
245
The vector container: capacity and size
vector<int> v; v.reserve( 10 );
cout << v.size() << endl;//???cout << v.capacity() << endl;//???
--------------------------------------
vector<int> gy( 256 );ifstream ifs("szoveg.txt"); int c;while( (c = ifs.get() ) != -1 ){
gy[ c ]++;}
Purpose?
![Page 246: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/246.jpg)
246
The vector - indexing
int Max = 100;vector<int> v(Max);//???...for (int i = 0; i < 2*Max; i++) {cout << v[ i ]<<” ”;
}--------------------------------------
int Max = 100;vector<int> v(Max);for (int i = 0; i < 2*Max; i++) {cout << v.at( i )<<” ”;
}
![Page 247: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/247.jpg)
247
The vector - indexing
int Max = 100;vector<int> v(Max);//???...for (int i = 0; i < 2*Max; i++) {cout << v[ i ]<<” ”;
}--------------------------------------
int Max = 100;vector<int> v(Max);for (int i = 0; i < 2*Max; i++) {cout << v.at( i )<<” ”;
}
Efficient
Safe
out_of_range exception
![Page 248: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/248.jpg)
248
The list container
– doubly linked list
1 2 3 4 5
l.end()l.begin()
list<int> l;for( int i=1; i<=5; ++i){
l.push_back( i );}
![Page 249: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/249.jpg)
249
The deque container
– double ended vector
deque<int> l;for( int i=1; i<=5; ++i){
l.push_front( i );}
![Page 250: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/250.jpg)
250
Algorithms - sort
– what to sort: [first, last)
– how to compare the elements:
● <● comp
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first,RandomAccessIterator last );
![Page 251: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/251.jpg)
251
Algorithms - sort
–
struct Rec {
string name;string addr;
};
vector<Rec> vr;
// …
sort(vr.begin(), vr.end(), Cmp_by_name());
sort(vr.begin(), vr.end(), Cmp_by_addr());
![Page 252: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/252.jpg)
252
Algorithms - sort
–
struct Cmp_by_name{bool operator()(const Rec& a, const Rec& b) const{return a.name < b.name;
}};struct Cmp_by_addr{bool operator()(const Rec& a, const Rec& b) const{return a.addr < b.addr;
}};
function object
![Page 253: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/253.jpg)
253
Strategy Design Pattern class ceepus_iterator
Context
+ ContextIn terface()
Strategy
+ Algori thmInterface()
ConcreteStrategyA
+ Algori thm Interface()
ConcreteStrategyB
+ Algori thm Interface()
ConcreteStrategyC
+ Algori thm Interface()
+strategy
● Define a family of algorithms, encapsulate each one, and make them interchangeable.
● Strategy lets the algorithm vary independently from clients that use it.
![Page 254: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/254.jpg)
254
Strategy Design Pattern class ceepus_iterator
Context
+ ContextIn terface()
Strategy
+ Algori thmInterface()
ConcreteStrategyA
+ Algori thm Interface()
ConcreteStrategyB
+ Algori thm Interface()
ConcreteStrategyC
+ Algori thm Interface()
+strategy
● Define a family of algorithms, encapsulate each one, and make them interchangeable.
● Strategy lets the algorithm vary independently from clients that use it.
sort
![Page 255: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/255.jpg)
255
Strategy Design Pattern class ceepus_iterator
Context
+ ContextIn terface()
Strategy
+ Algori thmInterface()
ConcreteStrategyA
+ Algori thm Interface()
ConcreteStrategyB
+ Algori thm Interface()
ConcreteStrategyC
+ Algori thm Interface()
+strategy
sortbool operator()(
const T&,const T&)
● Define a family of algorithms, encapsulate each one, and make them interchangeable.
● Strategy lets the algorithm vary independently from clients that use it.
![Page 256: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/256.jpg)
256
Strategy Design Pattern class ceepus_iterator
Context
+ ContextIn terface()
Strategy
+ Algori thmInterface()
ConcreteStrategyA
+ Algori thm Interface()
ConcreteStrategyB
+ Algori thm Interface()
ConcreteStrategyC
+ Algori thm Interface()
+strategy
sortbool operator()(
const T&,const T&)
Cmp_by_name Cmp_by_addr
![Page 257: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/257.jpg)
257
Iterators
– The container manages the contained objects but does not know about algorithms
– The algorithm works on data but does not know the internal structure of containers
– Iterators fit containers to algorithms
![Page 258: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/258.jpg)
258
Iterator - the glue
int x[]={1,2,3,4,5}; vector<int>v(x, x+5);int sum1 = accumulate(v.begin(), v.end(), 0);
list<int> l(x, x+5);double sum2 = accumulate(l.begin(), l.end(), 0);
1 2 3 4 5
v.end()v.begin()
1 2 3 4 5
l.end()l.begin()
![Page 259: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/259.jpg)
259
Iterator - the glue
template<class InIt, class T>T accumulate(InIt first, InIt last, T init){while (first!=last) {init = init + *first;++first;
}return init;
}
![Page 260: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/260.jpg)
260
The set container
set< Key[, Comp = less<Key>]>
usually implemented as a balanced binary search tree
Source:http://www.cpp-tutor.de/cpp/le18/images/set.gif
multiset: allows duplicates
Find the Error!
![Page 261: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/261.jpg)
261
The set container - usage
#include <set>
using namespace std;
set<int> intSet;
set<Person> personSet1;
set<Person, PersonComp> personSet2;
![Page 262: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/262.jpg)
262
The set container - usage
<#include <set>
set<int> intSet;
set<Person> personSet1;
set<Person, PersonComp> personSet2;
![Page 263: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/263.jpg)
263
The set container - usage
bool operator<(const Person&, const Person&)
<#include <set>
set<int> intSet;
set<Person> personSet1;
set<Person, PersonComp> personSet2;
![Page 264: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/264.jpg)
264
The set container - usage
bool operator<(const Person&, const Person&)
struct PersonComp{bool operator() ( const Person&, const Person& );
};
<#include <set>
set<int> intSet;
set<Person> personSet1;
set<Person, PersonComp> personSet2;
![Page 265: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/265.jpg)
265
The set container - usage
#include <set>
set<int> mySet;
while( cin >> nr ){
mySet.insert( nr );
}
set<int>::iterator iter;
for (iter=mySet.begin(); iter!=mySet.end(); ++iter){
cout << *iter << endl;
}
![Page 266: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/266.jpg)
266
The set container - usage
set<int>::iterator iter;
for (iter=mySet.begin(); iter!=mySet.end(); ++iter){
cout << *iter << endl;
}
----------------------------------------------------
for( auto& i: mySet ){
cout<<i<<endl;
}
![Page 267: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/267.jpg)
267
The multiset container - usage
multiset<int> mySet;
size_t nrElements = mySet.count(12);
multiset<int>::iterator iter;
iter = mySet.find(10);
if (iter == mySet.end()){ cout<<"The element does not exist"<<endl;
}
?
![Page 268: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/268.jpg)
268
The multiset container - usage
multiset<int> mySet;
auto a = mySet.find(10);
if (a == mySet.end()){ cout<<"The element does not exist"<<endl;
}
![Page 269: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/269.jpg)
269
The set container - usage
class PersonCompare;
class Person {
friend class PersonCompare;
string firstName;
string lastName;
int yearOfBirth;
public:
Person(string firstName, string lastName, int yearOfBirth);
friend ostream& operator<<(ostream& os, const Person& person);
};
![Page 270: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/270.jpg)
270
The set container - usage
class PersonCompare {
public:
enum Criterion { NAME, BIRTHYEAR};
private:
Criterion criterion;
public:
PersonCompare(Criterion criterion) : criterion(criterion) {}
bool operator()(const Person& p1, const Person& p2) {
switch (criterion) {
case NAME: //
case BIRTHYEAR: //
}
}
};
function object
state
behaviour
![Page 271: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/271.jpg)
271
The set container - usage
set<Person, PersonCompare> s( PersonCompare::NAME);
s.insert(Person("Biro", "Istvan", 1960));
s.insert(Person("Abos", "Gergely", 1986));
s.insert(Person("Gered","Attila", 1986));
----------------------------------------------------
for( auto& p: s){
cout << p <<endl;
}
?
C++2011
![Page 272: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/272.jpg)
272
The map container
map< Key, Value[,Comp = less<Key>]>
usually implemented as a balanced binary tree
Source: http://www.cpp-tutor.de/cpp/le18/images/map.gif
multimap: allows duplicatesmap: associative array
?
![Page 273: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/273.jpg)
273
The map container - usage
#include <map>
map<string,int> products;
products.insert(make_pair("tomato",10));
products.insert({"onion",3});
products["cucumber"] = 6;
cout<<products["tomato"]<<endl;
![Page 274: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/274.jpg)
274
The map container - usage
#include <map>
map<string,int> products;
products.insert(make_pair("tomato",10));
----------------------------------------------
products["cucumber"] = 6;
cout<<products["tomato"]<<endl;Difference between
[ ] and insert!!!
![Page 275: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/275.jpg)
275
The map container - usage
#include <map>
using namespace std;
int main (){
map < string , int > m;cout << m. size () << endl; // 0if( m["c++"] != 0 ){
cout << "not 0" << endl;}cout << m. size () << endl ; // 1
}
[ ] side effect
![Page 276: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/276.jpg)
276
The map container - usage
typedef map<string,int>::iterator MapIt;for(MapIt it= products.begin(); it != products.end(); ++it){ cout<<(it->first)<<" : "<<(it->second)<<endl;}
-------------------------------------------------- for( auto& i: products ){ cout<<(i.first)<<" : "<<(i.second)<<endl; }
C++2011
![Page 277: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/277.jpg)
277
The multimap container - usage
multimap<string, string> cities; cities.insert(make_pair("HU", "Budapest")); cities.insert(make_pair("HU", "Szeged")); cities.insert(make_pair("RO", "Seklerburg")); cities.insert(make_pair("RO", "Neumarkt")); cities.insert(make_pair("RO", "Hermannstadt"));
typedef multimap<string, string>::iterator MIT; pair<MIT, MIT> ret = cities.equal_range("HU"); for (MIT it = ret.first; it != ret.second; ++it) { cout << (*it).first <<"\t"<<(*it).second<<endl; }
![Page 278: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/278.jpg)
278
The multimap container - usage
multimap<string, string> cities; cities.insert(make_pair("HU", "Budapest")); cities.insert(make_pair("HU", "Szeged")); cities.insert(make_pair("RO", "Seklerburg")); cities.insert(make_pair("RO", "Neumarkt")); cities.insert(make_pair("RO", "Hermannstadt"));
auto ret = cities.equal_range("HU"); for (auto it = ret.first; it != ret.second; ++it){ cout << (*it).first <<"\t"<<(*it).second<<endl; } C++
2011
![Page 279: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/279.jpg)
279
The multimap container - usage
multimap<string, string> cities; cities.insert(make_pair("HU", "Budapest")); cities.insert(make_pair("HU", "Szeged")); cities.insert(make_pair("RO", "Seklerburg")); cities.insert(make_pair("RO", "Neumarkt")); cities.insert(make_pair("RO", "Hermannstadt"));
auto ret = cities.equal_range("HU"); for (auto it = ret.first; it != ret.second; ++it) { cout << (*it).first <<"\t"<<(*it).second<<endl; }
multimaps do not provide operator[ ]Why???
![Page 280: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/280.jpg)
280
The set/map container - removal
void erase ( iterator position );
size_type erase ( const key_type& x );
void erase ( iterator first, iterator last );
![Page 281: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/281.jpg)
281
The set – pointer key type
Output??
set<string *> animals;animals.insert(new string("monkey"));animals.insert(new string("lion"));animals.insert(new string("dog"));animals.insert(new string("frog"));
for( auto& i: animals ){cout<<*i<<endl;
}
![Page 282: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/282.jpg)
282
The set – pointer key type
Correctedstruct StringComp{ bool operator()(const string* s1, const string * s2){ return *s1 < *s2; }};set<string*, StringComp> animals;
animals.insert(new string("monkey")); animals.insert(new string("lion")); animals.insert(new string("dog")); animals.insert(new string("frog"));
------------------------------------------------------------------- for( auto& i: animals ){
cout<<*i<<endl; }
![Page 283: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/283.jpg)
283
Hash Tables
http://web.eecs.utk.edu/~huangj/CS302S04/notes/extendibleHashing.htm
collision
![Page 284: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/284.jpg)
284
Hash TablesCollision resolution by chaining
Source: http://integrator-crimea.com/ddu0065.html
![Page 285: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/285.jpg)
285
Unordered Associative Containers - Hash Tables
– unordered_set
– unordered_multiset
– unordered_map
– unordered_multimap
C++2011
![Page 286: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/286.jpg)
286
Unordered Associative Containers
– The STL standard does not specify which collision handling algorithm is required
● most of the current implementations use linear chaining ● a lookup of a key involves:
– a hash function call h(key)– calculates the index in the hash table
– compares key with other keys in the linked list
![Page 287: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/287.jpg)
287
Hash Function
– perfect hash: no collisions
– lookup time: O(1) - constant
– there is a default hash function for each STL hash container
![Page 288: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/288.jpg)
288
The unordered_map containertemplate <class Key, class T,
class Hash = hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc= std::allocator<pair<const Key, T>>>
class unordered_map;
Template parameters:
– Key – key type
– T – value type
– Hash – hash function type
– Pred – equality type
![Page 289: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/289.jpg)
289
The unordered_set containertemplate <class Key,
class Hash = hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc= std::allocator<pair<const Key, T>>>
class unordered_set;
Template parameters:
– Key – key type
– Hash – hash function type
– Pred – equality type
![Page 290: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/290.jpg)
290
Problem
– Read a file containing double numbers. Eliminate the duplicates.
– Solutions???
![Page 291: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/291.jpg)
291
Solutions
– vector<double> + sort + unique
– set<double>
– unordered_set<double>
– Which is the best? Why?
– What are the differences?
![Page 292: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/292.jpg)
292
Elapsed time
auto begin =chrono::high_resolution_clock::now();
//Code to benchmark
auto end = chrono::high_resolution_clock::now();
cout <<chrono::duration_cast<std::chrono::nanoseconds>
(end-begin).count()
<< "ns" << endl;
#include <chrono>
![Page 293: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/293.jpg)
293
class Class Mo...
RandomNumbers
# size: in t
+ Random Num bers(int)+ generate() : void+ getSize() : in t
SetRandomNumbers
- num bers: set<double>
+ SetRandom Num bers(int)+ generate() : vo id+ getSize() : in t
UnorderedSetRandomNumbers
- num bers: unordered_set<double>
+ UnorderedSetRandom Num bers(int)+ generate() : void+ getSize() : in t
VectorRandomNumbers
- num bers: vector<double>
+ VectorRandom Num bers(int)+ generate() : void+ getSize() : in t
![Page 294: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/294.jpg)
294
Ellapsed time
Container Time (mean)
vector 1.38 sec
set 3.04 sec
unordered_set 1.40 sec
![Page 295: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/295.jpg)
295
Which container to use?
– implement a PhoneBook, which:● stores names associated with their phone numbers;● names are unique;● one name can have multiple phone numbers
associated;● provides O(1) time search;
![Page 296: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/296.jpg)
296
Which container to use?– Usage:
PhoneBook pbook; pbook.addItem("kata","123456"); pbook.addItem("timi","444456"); pbook.addItem("kata","555456"); pbook.addItem("kata","333456"); pbook.addItem("timi","999456"); pbook.addItem("elod","543456"); cout<<pbook<<endl;
![Page 297: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/297.jpg)
297
unordered_map: example
class PhoneBook{ unordered_map<string, vector<string> > book;public: void addItem( string name, string phone); void removeItem( string name, string phone); vector<string> findItem( string name ); friend ostream& operator<<( ostream& os,
const PhoneBook& book); };
![Page 298: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/298.jpg)
298
unordered_map: example
typedef unordered_map<string, vector<string> >::iterator Iterator;
void PhoneBook::addItem( string name, string phone){ Iterator it = this->book.find( name ); if( it != book.end() ){ it->second.push_back( phone ); }else{ vector<string> phones; phones.push_back(phone); book.insert( make_pair(name, phones )); }}
![Page 299: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/299.jpg)
299
unordered_map: example
typedef unordered_map<string, vector<string> >::iterator Iterator;
void PhoneBook::addItem( string name, string phone){ Iterator it = this->book.find( name ); if( it != book.end() ){
vector<string> phones = it->second; phones.push_back( phone ); }else{ vector<string> phones; phones.push_back(phone); book.insert( make_pair(name, phones )); }}
Find the error and correct it!
![Page 300: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/300.jpg)
300
unordered_map: example
typedef unordered_map<string, vector<string> >::iterator Iterator;
void PhoneBook::addItem( string name, string phone){ Iterator it = this->book.find( name ); if( it != book.end() ){
vector<string>& phones = it->second; phones.push_back( phone ); }else{ vector<string> phones; phones.push_back(phone); book.insert( make_pair(name, phones )); }}
phone will be inserted into the
map
![Page 301: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/301.jpg)
301
C++/JavaC++ Java
Objects X x;X * px = new X();
X x = new X();
Parameter passing void f( X x );void f( X * px);void f( X& rx);void f( const X&rx);
void f( X x );//pass through reference
run-time binding only for virtual functions for each function (except static functions)
memory management explicit (2011 - smart pointers!) implicit (garbage collection)
multiple inheritance yes no
interface no (abstract class with pure virtual functions!)
yes
![Page 302: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/302.jpg)
302
Algorithms
![Page 303: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/303.jpg)
303
Algorithms
– OOP encapsulates data and functionality● data + functionality = object
– The STL separates the data (containers) from the functionality (algorithms)
● only partial separation
![Page 304: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/304.jpg)
304
Algorithms – why separation?
STL principles:
– algorithms and containers are independent
– (almost) any algorithm works with (almost) any container
– iterators mediate between algorithms and containers ● provides a standard interface to traverse the elements of
a container in sequence
![Page 305: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/305.jpg)
305
Algorithms Which one should be used?
set<int> s;set<int>::iterator it = find(s.begin(), s.end(), 7);if( it == s.end() ){ //Unsuccessful}else{ //Successful}
set<int> s;set<int>::iterator it = s.find(7);if( it == s.end() ){ //Unsuccessful}else{ //Successful}
![Page 306: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/306.jpg)
306
Algorithms Which one should be used?
set<int> s;set<int>::iterator it = find(s.begin(), s.end(), 7);if( it == s.end() ){ //Unsuccessful}else{ //Successful}
set<int> s;set<int>::iterator it = s.find(7);if( it == s.end() ){ //Unsuccessful}else{ //Successful}
O(n)
O(log n)
![Page 307: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/307.jpg)
307
Algorithm categories– Utility algorithms
– Non-modifying algorithms● Search algorithms● Numerical Processing algorithms● Comparison algorithms● Operational algorithms
– Modifying algorithms● Sorting algorithms● Set algorithms
![Page 308: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/308.jpg)
308
Utility Algorithms
– min_element()
– max_element()
– minmax_element() C++11
– swap()
![Page 309: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/309.jpg)
309
Utility Algorithms
vector<int>v = {10, 9, 7, 0, -5, 100, 56, 200, -24}; auto result = minmax_element(v.begin(), v.end() ); cout<<"min: "<<*result.first<<endl; cout<<"min position: "<<(result.first-v.begin())<<endl; cout<<"max: "<<*result.second<<endl; cout<<"max position: "<<(result.second-v.begin())<<endl; return 0;
![Page 310: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/310.jpg)
310
Non-modifying algorithmsSearch algorithms
– find(), find_if(), find_if_not(), find_first_of()
– binary_search()
– lower_bound(), upper_bound(), equal_range()
– all_of(), any_of(), none_of()
– ...
![Page 311: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/311.jpg)
311
Non-modifying algorithmsSearch algorithms - Example
– bool isEven (int i) { return ((i%2)==0); }
typedef vector<int>::iterator VIT;
int main () { vector<int> myvector={1,2,3,4,5}; VIT it= find_if (myvector.begin(), myvector.end(), isEven); cout << "The first even value is " << *it << '\n'; return 0;}
auto
![Page 312: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/312.jpg)
312
Non-modifying algorithmsNumerical Processing algorithms
– count(), count_if()
– accumulate()
– ...
![Page 313: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/313.jpg)
313
Non-modifying algorithmsNumerical Processing algorithms - Example
bool isEven (int i) { return ((i%2)==0); }
int main () { vector<int> myvector={1,2,3,4,5}; int n = count_if (myvector.begin(), myvector.end(), isEven); cout << "myvector contains " << n << " even values.\n"; return 0;}
[ ] (int i){ return i %2 == 0; }
![Page 314: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/314.jpg)
314
Non-modifying algorithmsComparison algorithms
– equal()
– mismatch()
– lexicographical_compare()
![Page 315: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/315.jpg)
315
Non-modifying algorithmsProblem
It is given strange alphabet – the order of characters are unusual.
Example for a strange alphabet: {b, c, a}. Meaning: 'b'->1, c->'2', 'a' ->3
In this alphabet: “abc” >”bca”
Questions:● How to represent the alphabet (which container and why)?● Write a function for string comparison using the strange
alphabet.
![Page 316: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/316.jpg)
316
Non-modifying algorithmsComparison algorithms - Example
// strange alphabet: 'a' ->3, 'b'->1, c->'2'map<char, int> order;
// Compares two characters based on the strange orderbool compChar( char c1, char c2 ){
return order[c1]<order[c2];}// Compares two strings based on the strange orderbool compString(const string& s1, const string& s2){
return lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), compChar);
}
![Page 317: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/317.jpg)
317
Non-modifying algorithmsComparison algorithms - Example
// strange alphabet: 'a' ->3, 'b'->1, c->'2'map<char, int> order;
// Compares two strings based on the strange orderstruct CompStr{
bool operator()(const string& s1, const string& s2){return lexicographical_compare(
s1.begin(), s1.end(), s2.begin(), s2.end(), [](char c1, char c2){return order[c1]<order[c2];} );
}}
set<string, CompStr> strangeSet;
![Page 318: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/318.jpg)
318
Non-modifying algorithmsOperational algorithms
– for_each()void doubleValue( int& x){ x *= 2;}
vector<int> v ={1,2,3};for_each(v.begin(), v.end(), doubleValue);
void doubleValue( int& x){ x *= 2;}
vector<int> v ={1,2,3};for_each(v.begin(), v.end(), doubleValue);
![Page 319: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/319.jpg)
319
Non-modifying algorithmsOperational algorithms
– for_each()void doubleValue( int& x){ x *= 2;}
vector<int> v ={1,2,3};for_each(v.begin(), v.end(), doubleValue);
for_each(v.begin(), v.end(), []( int& v){ v *=2;});
![Page 320: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/320.jpg)
320
Modifying algorithms
– copy(), copy_backward()
– move(), move_backward() C++11
– fill(), generate()
– unique(), unique_copy()
– rotate(), rotate_copy()
– next_permutation(), prev_permutation()
– nth_element() -nth smallest element
![Page 321: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/321.jpg)
321
Modifying algorithmsPermutations
void print( const vector<int>& v){ for(auto& x: v){ cout<<x<<"\t"; } cout << endl;}int main(){ vector<int> v ={1,2,3}; print( v ); while( next_permutation(v.begin(), v.end())){ print( v ); } return 0;}
![Page 322: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/322.jpg)
322
Modifying algorithmsnth_element
double median(vector<double>& v) { int n = v.size(); if( n==0 ) throw domain_error("empty vector"); int mid = n / 2; // size is an odd number if( n % 2 == 1 ){ nth_element(v.begin(), v.begin()+mid, v.end()); return v[mid]; } else{ nth_element(v.begin(), v.begin()+mid-1, v.end()); double val1 = v[ mid -1 ]; nth_element(v.begin(), v.begin()+mid, v.end()); double val2 = v[ mid ]; return (val1+val2)/2; }}
![Page 323: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/323.jpg)
323
Iterators
![Page 324: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/324.jpg)
324
Outline
– Iterator Design Pattern– Iterator Definition– Iterator Categories– Iterator Adapters
![Page 325: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/325.jpg)
325
Iterator Design Pattern
class Framewor...
Aggregate
+ CreateIterator()
ConcreteAggregate
+ CreateIterator()return new ConcretIterator(th is)
Iterator
+ First()+ Next()+ IsDone()+ CurrentItem()
ConcreteIterator
● Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
● The abstraction provided by the iterator pattern allows you to modify the collection implementation without making any change
![Page 326: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/326.jpg)
326
Iterator Design Pattern - Java
class Framewor...
Aggregate
+ CreateIterator()
ConcreteAggregate
+ CreateIterator()return new ConcretIterator(th is)
Iterator
+ First()+ Next()+ IsDone()+ CurrentItem()
ConcreteIterator
java.util.Iteratorjava.util.Collection
java.util.LinkedList java.util.ListIterator
![Page 327: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/327.jpg)
327
Iterator Design Pattern - C++
class Framewor...
Aggregate
+ CreateIterator()
ConcreteAggregate
+ CreateIterator()return new ConcretIterator(th is)
Iterator
+ First()+ Next()+ IsDone()+ CurrentItem()
ConcreteIterator
<iterator>class iterator
list<T> list<T>::iterator
![Page 328: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/328.jpg)
328
Definition
– Each container provides an iterator– Iterator – smart pointer – knows how to
iterate over the elements of that specific container
– C++ containers provides iterators a common iterator interface
![Page 329: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/329.jpg)
329
Base classtemplate <class Category, class T,
class Distance = ptrdiff_t, class Pointer = T*,
class Reference = T&> struct iterator { typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; typedef Category iterator_category; };
does not provide any of the functionality an iterator is expected to have.
![Page 330: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/330.jpg)
330
Iterator Categories
– Input Iterator– Output Iterator– Forward Iterator– Bidirectional Iterator– Random Access Iterator
![Page 331: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/331.jpg)
331
Iterator Categories
– Input Iterator: read forward, object=*it; it++;
– Output Iterator: write forward, *it=object; it++;
– Forward Iterator: read and write forward
– Bidirectional Iterator: read/write forward/backward, it++, it--;
– Random Access Iterator: it+n; it-n;
![Page 332: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/332.jpg)
332
Basic Operations
– *it: element access – get the element pointed to
– it->member: member access
– ++it, it++, --it, it--: advance forward/ backward
– ==, !=: equality
![Page 333: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/333.jpg)
333
Input Iterator
template<class InIt, class T>InIt find( InIt first, InIt last, T what){ for( ; first != last; ++first ) if( *first == what ){ return first;
} return first;}
![Page 334: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/334.jpg)
334
Input Iterator
template<class InIt, class Func>Func for_each( InIt first, InIt last, Func f){ for( ;first != last; ++first){
f( *first ); } return f;}
![Page 335: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/335.jpg)
335
Output Iterator
template <class InIt, class OutIt>OutIt copy( InIt first1, InIt last1,
OutIt first2){ while( first1 != last1 ){
*first2 = *first1; first1++; first2++; } return first2;}
![Page 336: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/336.jpg)
336
Forward Iterator
template < class FwdIt, class T >void replace ( FwdIt first, FwdIt last,
const T& oldv, const T& newv ){ for (; first != last; ++first){
if (*first == oldv){ *first=newv;
} }}
![Page 337: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/337.jpg)
337
Bidirectional Iterator
template <class BiIt, class OutIt>OutIt reverse_copy ( BiIt first, BiItlast, OutIt result){
while ( first!=last ){ --last; *result = *last; result++; } return result;}
![Page 338: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/338.jpg)
338
Find the second occurrence of an element!
template <class T, class It>It secondOccurrence(It first,It last, const T& what){
???}
![Page 339: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/339.jpg)
339
Find the second occurrence of an element!
template <class T, class It>It secondOccurrence(It first,It last,const T& what){
while( first != last && *first != what ){++first;
}if( first == last ){
return last;}++first;while( first != last && *first != what ){
++first;}return first;
}
![Page 340: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/340.jpg)
340
Containers & Iterators
– vector – Random Access Iterator
– deque - Random Access Iterator
– list – Bidirectional Iterator
– set, map - Bidirectional Iterator
– unordered_set – Forward Iterator
![Page 341: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/341.jpg)
341
Iterator adapters
– Reverse iterators– Insert iterators– Stream iterators
![Page 342: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/342.jpg)
342
Reverse iterators
– reverses the direction in which a bidirectional or random-access iterator iterates through a range.
– ++ ← → - -– container.rbegin()
– container.rend()
![Page 343: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/343.jpg)
343
Insert iterators
– special iterators designed to allow algorithms that usually overwrite elements to instead insert new elements at a specific position in the container.
– the container needs to have an insert member function
![Page 344: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/344.jpg)
344
Insert iterator - Example
//Incorrect int x[] = {1, 2, 3}; vector<int> v; copy( x, x+3, v.begin());
//Correct int x[] = {1, 2, 3}; vector<int> v; copy( x, x+3, back_inserter(v));
![Page 345: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/345.jpg)
345
Insert iterator - Example
template <class InIt, class OutIt>OutIt copy( InIt first1, InIt last1,OutIt first2){
while( first1 != last1){ *first2 = *first1;//overwrite → insert first1++; first2++; } return first2;}
![Page 346: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/346.jpg)
346
Types of insert iterators
Type Class Function Creation
Back inserter back_insert_iterator push_back(value) back_inserter(container)
Front inserter front_insert_iterator push_front(value) front_inserter(container)
Inserter insert_iterator insert(pos, value) inserter(container, pos)
*pos = value;
![Page 347: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/347.jpg)
347
Stream iterators
● Objective: connect algorithms to streams
cin vectorcopy
vector copy cout
![Page 348: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/348.jpg)
348
Stream iterator - examples
vector<int> v;copy(v.begin(), v.end(), ostream_iterator<int>(cout, ","));
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
![Page 349: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/349.jpg)
349
Problem 1.● It is given a CArray class
string str[]= {"apple", "pear", "plum", "peach", "strawberry", "banana"};
CArray<string> a(str, str+6);
![Page 350: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/350.jpg)
350
Problem 1.● It is given a Smart API too
Call the doIt function for CArray!
Smart<string> smart;smart.doIt( ? );
![Page 351: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/351.jpg)
351
Problem 1. - Solution
string str[]= {"apple", "pear", "plum", "peach", "strawberry"};CArray<string> a(str, str+5);CArrayIterator<string> cit ( a );Smart<string> smart;smart.doIt( cit );
![Page 352: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/352.jpg)
352
Problem 2.● It is given a CArray class
string str[]= {"apple", "pear", "plum", "peach", "strawberry", "banana"};
CArray<string> a(str, str+6);
![Page 353: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/353.jpg)
353
Problem 2.● It is given a Smarter API
class Smarter{public: template <class RaIt> void doIt( RaIt first, RaIt last ){ while( first != last ){ cout<< *first <<std::endl; ++first; } }};
![Page 354: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/354.jpg)
354
Problem 2.● Call the doIt function in the given way!
CArray<string> a(str, str+6);//... Smarter smart;smart.doIt( a.begin(), a.end() );
![Page 355: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/355.jpg)
355
Problem 2. - Solution A.template<class T>class CArray{public:
iterator begin(){ return iterator(array);} iterator end(){ return iterator(array+size);}private:
T * array;int size;
};
class iterator{T* poz;
public: ...};
![Page 356: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/356.jpg)
356
Problem 2. - Solution A.class CArray{public:
iterator begin(){ return iterator(array);} iterator end(){ return iterator(array+size);}private:
T * array;int size;
};
class iterator{T* poz;
public:iterator( T* poz=0 ): poz( poz ){}iterator( const iterator& it ){ poz = it.poz; }iterator& operator=( const iterator& it ){
if( &it == this ) return *this; poz = it.poz; return *this;}
iterator operator++(){ poz++; return *this; }iterator operator++( int p ){
iterator temp( *this ); poz++; return temp;}bool operator == ( const iterator& it )const{
return poz == it.poz;}bool operator != ( const iterator& it )const{
return poz != it.poz; }T& operator*() const { return *poz;}
};
![Page 357: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/357.jpg)
357
Problem 2. - Solution B.class CArray{public:
iterator begin(){ return array;}iterator end() { return array+size;}
private:T * array;int size;
};
typedef T * iterator;
![Page 358: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/358.jpg)
358
Carray → iterator
template <class T>class CArray{ T * data; int size;public: ... typedef T* iterator; typedef T value_type; typedef T& reference; typedef ptrdiff_t difference_type; typedef T * pointer;};
![Page 359: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/359.jpg)
359
Module 9
Function Objects & Lambdas
![Page 360: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/360.jpg)
360
Function object
–class FunctionObjectType {public:
return_type operator() (parameters) {Statements
}};
![Page 361: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/361.jpg)
361
Function pointer vs. function object
– A function object may have a state
– Each function object has its own type, which can be passed to a template (e.g. set, map)
– A function object is usually faster than a function pointer
![Page 362: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/362.jpg)
362
Function object as a sorting criteria
// create a set with special sorting criterionset<Person,PersonSortCriterion> coll;
class PersonSortCriterion {public:
bool operator() (const Person& p1, const Person& p2) const {
if (p1.lastname() != p2.lastname() ){return p1.lastname() < p2.lastname();
} else{return p1.firstname()<p2.firstname());
}};
![Page 363: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/363.jpg)
363
Function object with internal state
class IntSequence{private:
int value;public:
IntSequence (int initialValue) : value(initialValue) {}int operator() () {
return ++value;}
};
![Page 364: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/364.jpg)
364
Function object with internal state[Josuttis]
list<int> coll;
generate_n (back_inserter(coll), // start9, // number of elements
IntSequence(1)); // generates values, // starting with 1
![Page 365: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/365.jpg)
365
Function object with internal state[Josuttis]
list<int> coll;
generate_n (back_inserter(coll), // start9, // number of elements
IntSequence(1)); // generates values, // starting with 1
???
![Page 366: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/366.jpg)
366
Function object with internal state + for_each[Josuttis]
class MeanValue {private:
long num; // number of elementslong sum; // sum of all element values
public:MeanValue () : num(0), sum(0) {}void operator() (int elem) {
++num; // increment countsum += elem; // add value
}double value () {
return static_cast<double>(sum) / num;}
};
![Page 367: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/367.jpg)
367
function object with internal state + for_each[Josuttis]
int main(){
vector<int> coll = { 1, 2, 3, 4, 5, 6, 7, 8 };
MeanValue mv = for_each (coll.begin(), coll.end(), MeanValue());
cout << "mean value: " << mv.value() << endl;}
Why to use the return value? http://www.cplusplus.com/reference/algorithm/for_each/
![Page 368: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/368.jpg)
368
Predicates
● Are function objects that return a boolean value● A predicate should always be stateless
template <typename ForwIter, typename Predicate>ForwIter std::remove_if(ForwIter beg, ForwIter end,
Predicate op)
![Page 369: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/369.jpg)
369
Predefined function objects
Expression Effect
greater_equal<type>() param1 >= param2logical_not<type>() ! paramlogical_and<type>() param1 && param2logical_or<type>() param1 || param2bit_and<type>() param1 & param2bit_or<type>() param1 | param2bit_xor<type>() param1 ^ param2
Expression Effect
negate<type>() - paramplus<type>() param1 + param2minus<type>() param1 - param2multiplies<type>()param1 * param2divides<type>() param1 / param2modulus<type>() param1 % param2equal_to<type>()param1 == param2not_equal_to<type>() param1 != param2less<type>() param1 < param2greater<type>() param1 > param2less_equal<type>() param1 <= param2
![Page 370: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/370.jpg)
370
Lambdas
● a function that you can write inline in your source code
#include <iostream>
using namespace std;
int main(){ auto func = [] () { cout << "Hello world"; }; func(); // now call the function}
Syntactic sugar
C++2011
![Page 371: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/371.jpg)
371
Lambdas
– no need to write a separate function or to write a function object
– set
auto comp = [](string x, string y) { return x > y; }; set<string, decltype(comp)> s(comp); //... for (auto& x : s) { cout << x << endl; }
Syntactic sugar
![Page 372: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/372.jpg)
372
Lambda syntax [ ] ( )
opt ->
opt { }
[ captures ]
What outside variables are available, by value or by reference.
( params )
How to invoke it. Optional if empty.
-> ret
Uses new syntax. Optional if zero or one return statements.
{ statements; }
The body of the lambda
Syntactic sugar
[ captures ] ( params ) ->ret { statements; }
Herb Sutter: nwcpp.org/may-2011.html
![Page 373: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/373.jpg)
373
Examples
– Earlier in scope: Widget w;
– Capture w by value, take no parameters when invoked.
auto lamb = [w] { for( int i = 0; i < 100; ++i ) f(w); };
lamb();
– Capture w by reference, take a const int& when invoked.
auto da = [&w] (const int& i) { return f(w, i); };
int i = 42;
da( i );
Syntactic sugar
[ captures ] ( params ) ->ret { statements; }
Herb Sutter: nwcpp.org/may-2011.html
![Page 374: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/374.jpg)
374
Lambdas == Functors
class __functor {
};
Syntactic sugar
[ captures ] ( params ) ->ret { statements; }
private:CaptureTypes __captures;
public:__functor( CaptureTypes captures )
: __captures( captures ) { }
auto operator() ( params ) → { statements; }
Herb Sutter: nwcpp.org/may-2011.html
![Page 375: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/375.jpg)
375
Capture Example
class __functor {
};
Syntactic sugar
[ c1, &c2 ] { f(c1, c2); }
private:C1 __c1; C2& __c2;
public:__functor( C1 c1, C2& c2 )
: __c1(c1), __c2(c2) { }
void operator() () → { f(__c1, __c2); }
Herb Sutter: nwcpp.org/may-2011.html
![Page 376: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/376.jpg)
376
Parameter Example
class __functor {
};
Syntactic sugar
[ ] ( P1 p1, const P2& p2 ){ f(p1, p2); }
public:void operator() ( P1 p1, const P2& p2) {
f(p1, p2); }
Herb Sutter: nwcpp.org/may-2011.html
![Page 377: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/377.jpg)
377
Type of Lambdas
auto g = [&]( int x, int y ) { return x > y; };
map<int, int, ? > m( g );
Syntactic sugar
![Page 378: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/378.jpg)
378
Type of Lambdas
auto g = [&]( int x, int y ) { return x > y; };
map<int, int, ? > m( g );
Syntactic sugar
auto g = [&]( int x, int y ) { return x > y; };
map<int, int, decltype(g) > m( g );
![Page 379: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/379.jpg)
379
Example
int x = 5;int y = 12;auto pos = find_if (
coll.cbegin(), coll.cend(), // range[=](int i){return i > x && i < y;}// search criterion
);cout << "first elem >5 and <12: " << *pos << endl;
= symbols are passed by value
![Page 380: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/380.jpg)
380
Example
vector<int> vec = {1,2,3,4,5,6,7,8,9};int value = 3;int cnt = count_if(vec.cbegin(),vec.cend(),
[=](int i){return i>value;});cout << “Found “ << cnt << “ values > “ << value << endl;
![Page 381: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/381.jpg)
381
Module 10
Advanced C++
![Page 382: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/382.jpg)
382
Outline
– Casting. RTTI
– Handling Errors
– Smart Pointers
– Move Semantics (Move constructor, Move assignment)
– Random Numbers
– Regular Expressions
![Page 383: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/383.jpg)
383
Casting & RTTI
![Page 384: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/384.jpg)
384
Casting
– converting an expression of a given type into another type
– traditional type casting:
● (new_type) expression● new_type (expression)
– specific casting operators:
● dynamic_cast <new_type> (expression)● reinterpret_cast <new_type> (expression)● static_cast <new_type> (expression)● const_cast <new_type> (expression)
![Page 385: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/385.jpg)
385
static_cast<>() vs. C-style cast
– static_cast<>() gives you a compile time checking ability, C-Style cast doesn't.
– You would better avoid casting, except dynamic_cast<>()
![Page 386: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/386.jpg)
386
Run Time Type Information
– Determining the type of any variable during execution (runtime)
– Available only for polymorphic classes (having at least one virtual method)
– RTTI mechanism● the dynamic_cast<> operator● the typeid operator ● the type_info struct
![Page 387: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/387.jpg)
387
Casting Up and Downclass Super{public:
virtual void m1();};class Sub: public Super{public:
virtual void m1();void m2();
};
Sub mySub;//Super mySuper = mySub; // SLICESuper& mySuper = mySub; // No SLICEmySuper.m1(); // calls Sub::m1() - polymorphismmySuper.m2(); // ???
![Page 388: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/388.jpg)
388
dynamic_cast<> class Base{}; class Derived : public Base{};
Base* basePointer = new Derived(); Derived* derivedPointer = nullptr; //To find whether basePointer is pointing to Derived type of object
derivedPointer = dynamic_cast<Derived*>(basePointer); if (derivedPointer != nullptr){ cout << "basePointer is pointing to a Derived class object"; }else{ cout << "basePointer is NOT pointing to a Derived class object"; }
![Page 389: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/389.jpg)
389
dynamic_cast<> class Person{
public: virtual void print(){cout<<”Person”;}; }; class Employee:public Person{
public: virtual void print(){cout<<”Employee”;}; }; class Manager:public Employee{
public: virtual void print(){cout<<”Manager”;}; }; vector<Person*> v; v.push_back(new Person()); v.push_back(new Employee()); v.push_back( new Manager()); ...
![Page 390: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/390.jpg)
390
dynamic_cast<> class Person{
public: virtual void print(){cout<<”Person”;}; }; class Employee:public Person{
public: virtual void print(){cout<<”Employee”;}; }; class Manager:public Employee{
public: virtual void print(){cout<<”Manager”;}; }; vector<Person*> v; v.push_back(new Person()); v.push_back(new Employee()); v.push_back( new Manager()); ...
Write a code that counts the number of employees!
![Page 391: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/391.jpg)
391
dynamic_cast<> class Person{
public: virtual void print(){cout<<”Person”;}; }; class Employee:public Person{
public: virtual void print(){cout<<”Employee”;}; }; class Manager:public Employee{
public: virtual void print(){cout<<”Manager”;}; }; vector<Person*> v; v.push_back(new Person()); v.push_back(new Employee()); v.push_back( new Manager()); ...
Write a code that counts the number of employees!
Employee * p = nullptr; for( Person * sz: v ){ p = dynamic_cast<Employee *>( sz ); if( p != nullptr ){ ++counter; } }
![Page 392: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/392.jpg)
392
Which solution is better? (Solution 1)
void speak(const Animal& inAnimal) { if (typeid (inAnimal) == typeid (Dog)) { cout << "VauVau" << endl; } else if (typeid (inAnimal) == typeid (Bird)) { cout << "Csirip" << endl; }}
….Bird bird; Dog d;speak(bird); speak( dog ); ???
![Page 393: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/393.jpg)
393
Which solution is better? (Solution 2)
void speak(const Animal& inAnimal) {inAnimal.speak();
}Bird bird; Dog d;speak(bird); speak( dog );
class Animal{public: virtual void speak()=0;};class Dog:public Animal{public: virtual void speak(){cout<<"VauVau"<<endl;};};class Bird: public Animal{public: virtual void speak(){cout<<"Csirip"<<endl;};};
![Page 394: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/394.jpg)
394
typeid class Person{
public: virtual void print(){cout<<”Person”;}; }; class Employee:public Person{
public: virtual void print(){cout<<”Employee”;}; }; class Manager:public Employee{
public: virtual void print(){cout<<”Manager”;}; }; vector<Person*> v; v.push_back(new Person()); v.push_back(new Employee()); v.push_back( new Manager()); ...
Write a code that counts the number of employees (the exact type of the objects is Employee)!
counter = 0; for( Person * sz: v ){ if( typeid(*sz) == typeid(Employee) ){ ++counter; } }
![Page 395: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/395.jpg)
395
Typeid usage
#include <iostream> #include <typeinfo> using namespace std;
int main () {
int * a;int b; a=0; b=0;if (typeid(a) != typeid(b)){
cout << "a and b are of different types:\n";cout << "a is: " << typeid(a).name() << '\n';cout << "b is: " << typeid(b).name() << '\n';
}return 0;
}
a and b are of different types:a is: Pib is: i
![Page 396: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/396.jpg)
396
Handling Errors
![Page 397: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/397.jpg)
397
Handling Errors
– C++ provides Exceptions as an error handling mechanism
– Exceptions: to handle exceptional but not unexpected situations
![Page 398: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/398.jpg)
398
Return type vs. Exceptions
Return type:
● caller may ignore● caller may not propagate
upwards● doesn't contain sufficient
information
Exceptions:
● easier● more consistent● safer● cannot be ignored (your
program fails to catch an exception → will terminate)
● can skip levels of the call stack
![Page 399: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/399.jpg)
399
Exceptions
int SafeDivide(int num, int den) { if (den == 0) throw invalid_argument(“Divide by zero”); return num / den; } int main() { try { cout << SafeDivide(5, 2) << endl; cout << SafeDivide(10, 0) << endl; cout << SafeDivide(3, 3) << endl; } catch (const invalid_argument& e) { cout << “Caught exception: “ << e.what() << endl; } return 0;}
<stdexcept>
Discussion??!!!
![Page 400: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/400.jpg)
400
Exceptions
int SafeDivide(int num, int den) { if (den == 0) throw invalid_argument(“Divide by zero”); return num / den; } int main() { try { cout << SafeDivide(5, 2) << endl; cout << SafeDivide(10, 0) << endl; cout << SafeDivide(3, 3) << endl; } catch (const invalid_argument& e) { cout << “Caught exception: “ << e.what() << endl; } return 0;}
<stdexcept>
It is recommended to catch exceptions by const reference.
![Page 401: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/401.jpg)
401
HandExceptions
try {
// Code that can throw exceptions } catch (const invalid_argument& e) {
// Handle invalid_argument exception } catch (const runtime_error& e) {
// Handle runtime_error exception } catch (...) {
// Handle all other exceptions }
<stdexcept>
Any exception
![Page 402: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/402.jpg)
402
Throw List
void func() throw (extype1, extype2){ // statements }
<stdexcept>
The throw list is not enforced at compile time!
![Page 403: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/403.jpg)
403
Throw List
void func() throw (){ // statements }
<stdexcept>
void func() noexcept{ // statements }
C++2011
http://www.cplusplus.com/doc/tutorial/exceptions/
![Page 404: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/404.jpg)
404
The Standard Exceptions
<stdexcept>
http://cs.stmarys.ca/~porter/csc/ref/cpp_standlib.html
![Page 405: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/405.jpg)
405
User Defined Exception
– It is recommended to inherit
directly or indirectly from the standard
exception class
<stdexcept>
exception
your_exception
![Page 406: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/406.jpg)
406
User Defined Exception
class FileError : public runtime_error{ public:
FileError(const string& fileIn):runtime_error (“”) , mFile(fileIn) {} virtual const char* what() const noexcept{ return mMsg.c_str(); } string getFileName() { return mFile; } protected: string mFile, mMsg; };
<stdexcept>
![Page 407: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/407.jpg)
407
Smart Pointers
![Page 408: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/408.jpg)
408
Outline
– The problem: raw pointers– The solution: smart pointers– Examples– How to implement smart pointers
![Page 409: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/409.jpg)
409
Why Smart Pointers?
– When to delete an object?● No deletion → memory leaks● Early deletion (others still pointing to) →
dangling pointers● Double-freeing
![Page 410: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/410.jpg)
410
Smart Pointer Types
– unique_ptr
– shared_ptr
– weak_ptr
C++2011
It is recommended to use smart pointers!
#include <memory>
![Page 411: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/411.jpg)
411
Smart Pointers
– Behave like built-in (raw) pointers– Also manage dynamically created objects
● Objects get deleted in smart pointer destructor
– Type of ownership:● unique● shared
![Page 412: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/412.jpg)
412
The good old pointer
void oldPointer(){ Foo * myPtr = new Foo(); myPtr->method(); } Memory leak
![Page 413: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/413.jpg)
413
The good Old pointer
void oldPointer1(){ Foo * myPtr = new Foo(); myPtr->method(); }
void oldPointer2(){ Foo * myPtr = new Foo(); myPtr->method(); delete myPtr; }
Memory leak
Could cause memory leak
When?
![Page 414: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/414.jpg)
414
The Old and the New
void oldPointer(){ Foo * myPtr = new Foo(); myPtr->method(); }
void newPointer(){ shared_ptr<Foo> myPtr (new Foo()); myPtr->method(); }
Memory leak
![Page 415: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/415.jpg)
415
Creating smart pointers
void newPointer(){ shared_ptr<Foo> myPtr (new Foo()); myPtr->method(); }
void newPointer(){ auto myPtr = make_shared<Foo>(); myPtr->method(); }
Static factory method
![Page 416: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/416.jpg)
416
unique_ptr
– it will automatically free the resource in case of the unique_ptr goes out of scope.
![Page 417: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/417.jpg)
417
shared_ptr
– Each time a shared_ptr is assigned
● a reference count is incremented (there is one more “owner” of the data)
– When a shared_ptr goes out of scope
● the reference count is decremented● if reference_count = 0 the object referenced by the
pointer is freed.
![Page 418: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/418.jpg)
418
Implementing your own smart pointer class
CountedPtr<Person> p(new Person("Para Peti",1980));
p: CountedPtr<Person>
ptr
count
:Person
"Para Peti"
1
![Page 419: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/419.jpg)
419
Implementing your own smart pointer class
p
ptrcount
ptrcount
ptrcount
p2
p13
:Person
"Para Peti"
CountedPtr<Person> p1 = p; CountedPtr<Person> p2 = p;
![Page 420: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/420.jpg)
420
Implementation (1)
template < class T> class CountedPtr{ T * ptr; long * count; public: ... };
![Page 421: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/421.jpg)
421
Implementation (2)
CountedPtr( T * p = 0 ):ptr( p ), count( new long(1)){}
CountedPtr( const CountedPtr<T>& p ): ptr( p.ptr), count(p.count){ ++(*count);}
~CountedPtr(){ --(*count); if( *count == 0 ){ delete count; delete ptr; }}
![Page 422: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/422.jpg)
422
Implementation (3)
CountedPtr<T>& operator=( const CountedPtr<T>& p ){ if( this != &p ){ --(*count); if( *count == 0 ){ delete count; delete ptr; } this->ptr = p.ptr; this->count = p.count; ++(*count); } return *this;}
T& operator*() const{ return *ptr;}
T* operator->() const{ return ptr;}
![Page 423: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/423.jpg)
423
Shared ownership with shared_ptr
spspsp
Container ofsmart pointers
o1 o3o2
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
Container ofsmart pointers
spspsp
![Page 424: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/424.jpg)
424
Problem with shared_ptr
spspsp
Container ofsmart pointers
sp sp
sp
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
Objects pointing to another object with a smart pointer
![Page 425: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/425.jpg)
425
Solution: weak_ptr
spspsp
Container ofsmart pointers
wp wp
wp
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
Objects pointing to another object with a weak pointer
![Page 426: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/426.jpg)
426
weak_ptr
– Observe an object, but does not influence its lifetime
– Like raw pointers - the weak pointers do not keep the pointed object alive
– Unlike raw pointers – the weak pointers know about the existence of pointed-to object
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
![Page 427: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/427.jpg)
427
How smart pointers work
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
sp1
sp3
sp2
PointerShared count: 3Weak count: 2
shared_ptr
wp1 wp2
Manager object Managed object
weak_ptr
![Page 428: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/428.jpg)
428
Restrictions in using smart pointers
– Can be used to refer to objects allocated with new (can be deleted with delete).
– Avoid using raw pointer to the object refered by a smart pointer.
http://umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf
![Page 429: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/429.jpg)
429
Inheritance and shared_ptr
void greeting( shared_ptr<Person>& ptr ){ cout<<"Hello "<<(ptr.get())->getFname()<<" " <<(ptr.get())->getLname()<<endl;}
int main(int argc, char** argv) { shared_ptr<Person> ptr_person(new Person("John","Smith")); cout<<*ptr_person<<endl; greeting( ptr_person ); shared_ptr<Manager> ptr_manager(new Manager("Black","Smith", "IT")); cout<<*ptr_manager<<endl; ptr_person = ptr_manager; cout<<*ptr_person<<endl; return 0;}
![Page 430: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/430.jpg)
430
unique_ptr usage
// p owns the Personunique_ptr<Person> uptr(new Person("Mary", "Brown"));
unique_ptr<Person> uptr1( uptr ); //ERROR – Compile time
unique_ptr<Person> uptr2; //OK. Empty unique_ptr
uptr2 = uptr1; //ERROR – Compile timeuptr2 = move( uptr ); //OK. uptr2 is the ownercout<<"uptr2: "<<*uptr2<<endl; //OKcout<<"uptr : "<<*uptr <<endl; //ERROR – Run time
unique_ptr<Person> uptr3 = make_unique<Person>("John","Dee");cout<<*uptr3<<endl;
StaticFactory Method
![Page 431: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/431.jpg)
431
unique_ptr usage (2)
unique_ptr<Person> uptr1 = make_unique<Person>("Mary","Black");
unique_ptr<Person> uptr2 = make_unique<Person>("John","Dee");cout<<*uptr2<<endl;
vector<unique_ptr<Person> > vec;vec.push_back( uptr1 );vec.push_back( uptr2 ); cout<<"Vec [";for( auto e: vec ){
cout<<*e<<" ";}cout<<"]"<<endl;
Find the errorsand correct them!!!
![Page 432: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/432.jpg)
432
unique_ptr usage (2)
unique_ptr<Person> uptr1 = make_unique<Person>("Mary","Black");
unique_ptr<Person> uptr2 = make_unique<Person>("John","Dee");cout<<*uptr2<<endl;
vector<unique_ptr<Person> > vec;vec.push_back( move( uptr1 ) );vec.push_back( move( uptr2 ) ); cout<<"Vec [";for( auto& e: vec ){
cout<<*e<<" ";}cout<<"]"<<endl;
![Page 433: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/433.jpg)
433
Module 11
I/O Streams
![Page 434: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/434.jpg)
434
Outline
– Using Streams– String Streams– File Streams– Bidirectional I/O
![Page 435: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/435.jpg)
435
Using Streams
● file● keypad● program
Input Stream Output Stream● file● screen● program
Prog-ram
stream:● is data flow● direction● associated source and destination
![Page 436: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/436.jpg)
436
Using Streams
cin An input stream, reads data from the “input console.”
cout A buffered output stream, writes data to the output console.
cerr An unbuffered output stream, writes data to the “error console” clog A buffered version of cerr.
![Page 437: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/437.jpg)
437
Using Streams
– Stream:● includes data● has a current position
– next read or next write
![Page 438: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/438.jpg)
438
Using Streams
basic_iostream<>iostream, wiostream
ios_base
basic_ios<> ios, wios
basic_istream<>istream, wistream
basic_ostream<>ostream, wostream
basic_streambuf<>streambuf, wstreambuf
![Page 439: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/439.jpg)
439
Using Streams
– Output stream:● inserter operator <<● raw output methods (binary):
– put(), write()
void rawWrite(const char* data, int dataSize){cout.write(data, dataSize);
}
void rawPutChar(const char* data, int charIndex){
cout.put(data[charIndex]);}
![Page 440: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/440.jpg)
440
Using Streams
– Output stream:● most output streams buffer data (accumulate)● the stream will flush (write out the accumulated data)
when:– an endline marker is reached ('\n', endl)– the stream is destroyed (e.g. goes out of scope)– the stream buffer is full– explicitly called flush()
![Page 441: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/441.jpg)
441
Using Streams
– Manipulators:● objects that modify the behavior of the stream
– setw, setprecision– hex, oct, dec– C++11: put_money, put_time
int i = 123;printf(“This should be ' 123': %6d\n”, i);cout <<“This should be ' 123': “ << setw(6) << i << endl;
![Page 442: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/442.jpg)
442
Using Streams
– Input stream:● extractor operator >>
– will tokenize values according to white spaces● raw input methods (binary):
– get(): avoids tokenization
string readName(istream& inStream){
string name;char next;while (inStream.get(next)) {
name += next;}return name;
}
reads an input having more than one word
![Page 443: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/443.jpg)
443
Using Streams
– Input stream:● getline(): reads until end of line
string myString;getline(cin, myString);
reads an input having more than one word
![Page 444: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/444.jpg)
444
Using Streams
– Input stream:● getline(): reads until end of line
string myString;getline(cin, myString);
reads an input having more than one word
Reads up to new line characterUnix line ending: '\n'
Windows line ending: '\r' '\n'The problem is that getline leaves
the '\r' on the end of the string.
![Page 445: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/445.jpg)
445
Using Streams
– Stream's state:● every stream is an object → has a state● stream's states:
– good: OK– eof: End of File– fail: Error, last I/O failed– bad: Fatal Error
![Page 446: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/446.jpg)
446
Using Streams
– Find the error!
list<int> a;
int x;
while( !cin.eof() ){
cin>>x;
a.push_back( x );
}
Input: 12 3(empty line)
a: 1, 2, 3, 3
![Page 447: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/447.jpg)
447
Using Streams
– Handling Input Errors:● while( cin )● while( cin >> ch )
int number, sum = 0;while ( true ) {
cin >> number;if (cin.good()){
sum += number;} else{
break;}
}
int number, sum = 0;while ( cin >> number ){
sum += number;}
![Page 448: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/448.jpg)
448
String Streams– <sstream>
● ostringstream
● istringstream
● stringstream
string s =”12.34”;stringstream ss(s);double d;ss >> d;
double d =12.34;stringstream ss;ss<<d;string s = “szam:”+ss.str()
![Page 449: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/449.jpg)
449
File Streams{ ifstream ifs("in.txt");//Constructor if( !ifs ){
//File open error
} //Destructor call will close the stream}
{ ifstream ifs; ifs.open("in.txt"); //... ifs.close(); //...}
![Page 450: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/450.jpg)
450
File Streams
– Byte I/O
ifstream ifs("dictionary.txt"); // ios::trunc means that the output file will be // overwritten if exists ofstream ofs("dict.copy", ios::trunc);
char c; while( ifs.get( c ) ){ ofs.put( c ); }
![Page 451: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/451.jpg)
451
File Streams
– Byte I/O – Using rdbuf() - quicker– ifstream ifs("dictionary.txt"); // ios::trunc means that the output file will be // overwritten if exists ofstream ofs("dict.copy", ios::trunc);
if (ifs && ofs) { ofs << ifs.rdbuf(); }
![Page 452: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/452.jpg)
452
Object I/O
– Operator overloadingistream& operator>>( istream& is, T& v ){ //read v return is;}
ostream& operator<<(ostream& is, const T& v ){ //write v return os;}
![Page 453: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/453.jpg)
453
Module 12
Concurrency
![Page 454: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/454.jpg)
454
Outline
– High-level interface: async() and future
– Low-level interface: thread, promise
– Synchronizing threads– Mutexes and locks: mutex, lock_guard, unique_lock
– Atomics
![Page 455: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/455.jpg)
455
Problem
Find all words matching a pattern in a dictionary!
Pattern: a..l.
Word: apple, apply, ...
http://marknelson.us/2012/05/23/c11-threading-made-easy/
![Page 456: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/456.jpg)
456
Single-threaded Solution (1) string pattern ="a..l.";
// Load the words into the deque ifstream f( "dobbsdict.txt" ); if ( !f ) { cerr << "Cannot open dobbsdict.txt in the current directory\n"; return 1; } string word; deque<string> backlog; while ( f >> word ){ backlog.push_back( word );
} // Now process the words and print the results vector<string> words = find_matches(pattern, backlog); cerr << "Found " << words.size()<< " matches for " << pattern<< endl; for ( auto s : words ){ cout << s << "\n";
}
![Page 457: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/457.jpg)
457
Single-threaded Solution (2)
vector<string> find_matches( string pattern, deque<string> &backlog ){ vector<string> results; for ( ; ; ) { if ( backlog.size() == 0 ) { return results;} string word = backlog.front(); backlog.pop_front(); if ( match( pattern, word ) ){ results.push_back( word );} }
return results;}
inline bool match( const string &pattern, string word ){ if ( pattern.size() != word.size() ) return false; for ( size_t i = 0 ; i < pattern.size() ; i++ ) if ( pattern[ i ] != '.' && pattern[ i ] != word[ i ] ) return false; return true;}
![Page 458: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/458.jpg)
458
Multi-threaded Solution (1) string pattern ="a..l.";
// Load the words into the deque ifstream f( "dobbsdict.txt" ); if ( !f ) { cerr << "Cannot open sowpods.txt in the current directory\n"; return 1; } string word; deque<string> backlog; while ( f >> word ){ backlog.push_back( word );} // Now process the words and print the results auto f1 = async( launch::async, find_matches, pattern, ref(backlog) ); auto f2 = async( launch::async, find_matches, pattern, ref(backlog) ); auto f3 = async( launch::async, find_matches, pattern, ref(backlog) ); print_results( f1, pattern, 1 ); print_results( f2, pattern, 2 ); print_results( f3, pattern, 3 );
Worker threadReturns a std::future object
![Page 459: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/459.jpg)
459
Multi-threaded Solution (1) string pattern ="a..l.";
// Load the words into the deque ifstream f( "dobbsdict.txt" ); if ( !f ) { cerr << "Cannot open sowpods.txt in the current directory\n"; return 1; } string word; deque<string> backlog; while ( f >> word ){ backlog.push_back( word );} // Now process the words and print the results auto f1 = async( launch::async, find_matches, pattern, ref(backlog) ); auto f2 = async( launch::async, find_matches, pattern, ref(backlog) ); auto f3 = async( launch::async, find_matches, pattern, ref(backlog) ); print_results( f1, pattern, 1 ); print_results( f2, pattern, 2 ); print_results( f3, pattern, 3 ); parameter as a reference
![Page 460: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/460.jpg)
460
Multi-threaded Solution (2)
template<class ASYNC>void print_results( ASYNC &f, string &pattern, int threadno ){ vector<string> words = f.get(); cerr << "Found " << words.size()<< " matches for " << pattern << " in thread " << threadno<< endl; for ( auto s : words ){ cout << s << "\n";}}
std::future<>::get() -returns the return value of the async function -blocks until the thread is complete
![Page 461: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/461.jpg)
461
Multi-threaded Solution (3)
std::mutex m;
vector<string> find_matches( string pattern, deque<string> &backlog ){ vector<string> results; for ( ; ; ) { m.lock(); if ( backlog.size() == 0 ) { m.unlock(); return results; } string word = backlog.front(); backlog.pop_front(); m.unlock(); if ( match( pattern, word ) ) results.push_back( word ); }}
![Page 462: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/462.jpg)
462
Performance
Multi-threaded vs. Single-threaded solution!!!
![Page 463: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/463.jpg)
463
Futures
Objectives
– makes easy to get the computed result back from a thread,
– able to transport an uncaught exception to another thread.
1. When a function has calculated the return value
2. Put the value in a promise object
3. The value can be retrieved through a future
inter-thread communication
channel
![Page 464: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/464.jpg)
464
Futures
– if the other thread has not yet finished the call to get() will block
– avoid blocking:
future<T> fut = …// launch a thread or asyncT result = fut.get();
if( fut.wait_for( 0 ) ){T result = fut.get();
} else{...
}
![Page 465: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/465.jpg)
465
mutex [Gregoire]
int val; mutex valMutex; valMutex.lock(); if (val >= 0) { f(val); } else {
f(-val); } valMutex.unlock();
mutex = mutual exclusion
Helps to control the concurrent access ofa resource
![Page 466: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/466.jpg)
466
mutex
int val; mutex valMutex; valMutex.lock(); if (val >= 0) { f(val); } else {
f(-val); } valMutex.unlock();
What happensin case of an exception?
![Page 467: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/467.jpg)
467
mutex vs. lock_guard<mutex>
int val; mutex valMutex; valMutex.lock(); if (val >= 0) { f(val); } else {
f(-val); } valMutex.unlock();
int val; mutex valMutex; lock_guard<mutex> lg(valMutex); if (val >= 0) { f(val); } else {
f(-val); }
RAII principle (Resource Acquisition Is Initialization)
![Page 468: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/468.jpg)
468
lock_guard<mutex>
int val; mutex valMutex; { lock_guard<mutex> lg(valMutex); if (val >= 0) { f(val); } else {
f(-val); } }
RAII principle (Resource Acquisition Is Initialization)
Constructor: acquires the resource
Destructor: releases the resource
![Page 469: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/469.jpg)
469
unique_lock<mutex>
unique_lock = lock_guard + lock() & unlock()
![Page 470: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/470.jpg)
470
Multithreaded Logger [Gregoire]
class Logger {public: Logger(); void log(const string& entry);protected: void processEntries(); mutex mMutex; condition_variable mCondVar; queue<string> mQueue; thread mThread; // The background thread.private: // Prevent copy construction and assignment. Logger(const Logger& src); Logger& operator=(const Logger& rhs);};
![Page 471: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/471.jpg)
471
Multithreaded Logger [Gregoire]
Logger::Logger() { // Start background thread. mThread = thread{&Logger::processEntries, this};}
void Logger::log(const std::string& entry) { // Lock mutex and add entry to the queue. unique_lock<mutex> lock(mMutex); mQueue.push(entry); // Notify condition variable to wake up thread. mCondVar.notify_all();}
![Page 472: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/472.jpg)
472
Multithreaded Logger [Gregoire]
void Logger::processEntries(){ ofstream ofs(“log.txt”); if (ofs.fail()){ … return; } unique_lock<mutex> lock(mMutex); while (true) { // Wait for a notification. mCondVar.wait(lock);
// Condition variable is notified → something is in the queue. lock.unlock(); while (true) { lock.lock();
if (mQueue.empty()) {break;
} else {ofs << mQueue.front() << endl;mQueue.pop();
}lock.unlock();
} }}
![Page 473: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/473.jpg)
473
Usage: Multithreaded Logger [Gregoire]
void logSomeMessages(int id, Logger& logger){
for (int i = 0; i < 10; ++i) {stringstream ss;ss << “Log entry “ << i << “ from thread “ << id;logger.log(ss.str());
}}int main(){
Logger logger;vector<thread> threads;// Create a few threads all working with the same Logger instance.for (int i = 0; i < 10; ++i) {
threads.push_back(thread(logSomeMessages, i, ref(logger)));}// Wait for all threads to finish.for (auto& t : threads) {
t.join();}return 0;
}
Netbeans: Logger1 Logger1.exe..stackdump
![Page 474: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/474.jpg)
474
Problem: Multithreaded Logger [Gregoire]
![Page 475: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/475.jpg)
475
Problem: Multithreaded Logger [Gregoire]
end of main() → terminate abruptly Logger thread
![Page 476: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/476.jpg)
476
Solution: Multithreaded Logger [Gregoire]
class Logger{public:
Logger();// Gracefully shut down background thread.virtual ~Logger();// Add log entry to the queue.void log(const std::string& entry);
protected:void processEntries();bool mExit;
...};
![Page 477: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/477.jpg)
477
Solution: Multithreaded Logger [Gregoire]
void Logger::processEntries(){ …
while (true) {// Wait for a notification.mCondVar.wait(lock);// Condition variable is notified, so something is in the queue// and/or we need to shut down this thread.lock.unlock();while (true) {
lock.lock();if (mQueue.empty()) {
break;} else {
ofs << mQueue.front() << endl;mQueue.pop();
}lock.unlock();
}if (mExit) break;
}}
![Page 478: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/478.jpg)
478
Solution: Multithreaded Logger [Gregoire]
Logger::Logger() : mExit(false){// Start background thread.mThread = thread{&Logger::processEntries, this};}Logger::~Logger(){
// Gracefully shut down the thread by setting mExit// to true and notifying the thread.mExit = true;// Notify condition variable to wake up thread.mCondVar.notify_all();// Wait until thread is shut down.mThread.join();
}
![Page 479: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/479.jpg)
479
Solution: Multithreaded Logger [Gregoire]
Logger::Logger() : mExit(false){// Start background thread.mThread = thread{&Logger::processEntries, this};}Logger::~Logger(){
// Gracefully shut down the thread by setting mExit// to true and notifying the thread.mExit = true;// Notify condition variable to wake up thread.mCondVar.notify_all();// Wait until thread is shut down.mThread.join();
}
![Page 480: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/480.jpg)
480
Solution: Multithreaded Logger [Gregoire]
?Deadlock
![Page 481: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/481.jpg)
481
Solution: Multithreaded Logger [Gregoire]
It can happen that this remaining code from the main() function, including the Logger destructor, is executed before the Logger background thread has started its processing loop. When that happens, the Logger destructor will already have called notify_all() before the background thread is waiting for the notifi cation, and thus the background thread will miss this notifi cation from the destructor.
![Page 482: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/482.jpg)
482
Object PoolThread Pool
ObjectPool
resources: Collection
rFactory: FactorymaxResources: int
aquireObject()
releaseObject()
Factory
createResource()
11
Resource
1 *
![Page 483: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/483.jpg)
483
Object PoolC++ implementation [Gregoire]
template <typename T>class ObjectPool{public: ObjectPool(size_t chunkSize = kDefaultChunkSize) throw(std::invalid_argument, std::bad_alloc); shared_ptr<T> acquireObject(); void releaseObject(shared_ptr<T> obj);protected: queue<shared_ptr<T>> mFreeList; size_t mChunkSize; static const size_t kDefaultChunkSize = 10; void allocateChunk();private: // Prevent assignment and pass-by-value ObjectPool(const ObjectPool<T>& src); ObjectPool<T>& operator=(const ObjectPool<T>& rhs);};
![Page 484: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/484.jpg)
484
Object PoolC++ implementation [Gregoire]
template <typename T> ObjectPool<T>::ObjectPool(size_t chunkSize) throw(std::invalid_argument, std::bad_alloc){
if (chunkSize == 0) {throw std::invalid_argument(“chunk size must be positive”);
}mChunkSize = chunkSize;allocateChunk();
}
![Page 485: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/485.jpg)
485
Object PoolC++ implementation [Gregoire]
template <typename T> void ObjectPool<T>::allocateChunk() { for (size_t i = 0; i < mChunkSize; ++i) { mFreeList.push(std::make_shared<T>()); } }
![Page 486: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/486.jpg)
486
Object PoolC++ implementation [Gregoire]
template <typename T> shared_ptr<T> ObjectPool<T>::acquireObject() { if (mFreeList.empty()) { allocateChunk(); } auto obj = mFreeList.front(); mFreeList.pop(); return obj; }
![Page 487: Modern C++ Object-Oriented Programmingmanyi/teaching/c++/CPP_v1.2.pdf · 2018-12-19 · Modern C++ Object-Oriented Programming ''Combine old and newer features to get the best out](https://reader033.vdocuments.net/reader033/viewer/2022042014/5e73870a13139b1b0a2b51d3/html5/thumbnails/487.jpg)
487
Object PoolC++ implementation [Gregoire]
template <typename T> void ObjectPool<T>::releaseObject(shared_ptr<T> obj) { mFreeList.push(obj); }