Difference between revisions of "Effective Analysis Programming Part 2"
From Gridkaschool
m |
(→Polymorphism) |
||
Line 4: | Line 4: | ||
===Polymorphism=== |
===Polymorphism=== |
||
+ | ====exercise 1: virtual functions==== |
||
<source lang="cpp"> |
<source lang="cpp"> |
||
#include<iostream> |
#include<iostream> |
||
Line 66: | Line 67: | ||
</source> |
</source> |
||
+ | * Run the code to see which versions of getArea() get called. Remove the keyword virtual in the base class and run the code again. |
||
+ | * Recall why non-virtal destructors are dangerous? |
||
+ | * Why are not all destructors virtual by default? The next execise will help you to answer this question. |
||
+ | ====exercise 2==== |
||
==C++ Templates== |
==C++ Templates== |
Revision as of 10:22, 28 August 2013
Contents
Gridka School slides
- Tools: GKS2013EffectiveAnalysisTools.pdf
- Templates: GKS2013EffectiveAnalysisTemplates.pdf
Polymorphism
exercise 1: virtual functions
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
class Shape {
public:
virtual double getArea() const =0;
};
class Circle: public Shape {
public:
Circle() : radius(1.) {
}
explicit Circle(double r) : radius(r) {
}
virtual double getArea() const {
cout<<"Circle::getArea"<<endl;
return M_PI*radius*radius;
}
private:
double radius;
};
class Square: public Shape {
public:
Square() : length(1.) {
}
explicit Square(double l) : length(l) {
}
virtual double getArea() const {
cout<<"Square::getArea"<<endl;
return length*length;
}
private:
double length;
};
int main() {
vector<Shape*> myShapes;
myShapes.push_back(new Circle(2.));
myShapes.push_back(new Square(3.));
cout<<myShapes[0]->getArea()<<endl;
cout<<myShapes[1]->getArea()<<endl;
delete myShapes[0];
delete myShapes[1];
}
- Run the code to see which versions of getArea() get called. Remove the keyword virtual in the base class and run the code again.
- Recall why non-virtal destructors are dangerous?
- Why are not all destructors virtual by default? The next execise will help you to answer this question.
exercise 2
C++ Templates
exercise 1: pair
std::pair is a simple template class to store a pair of values.
- Familiarize yourself with the interface of std::pair: http://www.cplusplus.com/reference/utility/pair/
- Implement your own version: gks::pair with the same members and operators.
- Give examples for the usage of std::pair.
exercise 2: read paramerters
The library readparamertes can be used to read values from a text file like:
# GKS 2013
answer 42
parser_test "\\\"" "#" #should result in \" and #
useful yes
The following code is an example how to use readparameters:
#define MAIN_CPP
#include <iostream>
#include <exception>
#include "readparameters.h"
using namespace std;
int main(int argc,char **argv){
//check arguments
if (argc!=2) {
cerr<<"Usage: ./params <paramfile>"<<endl;
return 1;
}
//get input filename from parameter file
int answer;
vector<string> v;
try {
readparameters rp(argv[1]);
answer = rp.get<int>("answer");
v=rp.get_vector<string>("parser_test");
cout<<answer<<endl;
rp.print_tabular(); //debug output
rp.get<long>("Atlantis"); //exception
}
catch (exception& e) {
cerr<<e.what()<<endl;
return 1;
}
return 0;
}
- Run the code, add more parameters to the text file, read a boolean parameter.
- Read the code of the class readparamerters (you may skip the parsing part in the constructor).
- get and get_vector are template functions. Why are there specializations for bool and string?
- Why is the map tabular mutual?
- What are the requirements for types to work with readparameters?
- Why is the default constructor privat?