Difference between revisions of "Effective Analysis Programming Part 2"
From Gridkaschool
m |
m |
||
Line 2: | Line 2: | ||
* Tools: [[media:GKS2013EffectiveAnalysisTools.pdf|GKS2013EffectiveAnalysisTools.pdf]] |
* Tools: [[media:GKS2013EffectiveAnalysisTools.pdf|GKS2013EffectiveAnalysisTools.pdf]] |
||
* Templates: [[media:GKS2013EffectiveAnalysisTemplates.pdf|GKS2013EffectiveAnalysisTemplates.pdf]] |
* Templates: [[media:GKS2013EffectiveAnalysisTemplates.pdf|GKS2013EffectiveAnalysisTemplates.pdf]] |
||
+ | |||
+ | ===Polymorphism=== |
||
+ | <source lang="cpp"> |
||
+ | #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]; |
||
+ | } |
||
+ | </source> |
||
+ | |||
+ | |||
==C++ Templates== |
==C++ Templates== |
||
====exercise 1: pair==== |
====exercise 1: pair==== |
Revision as of 10:18, 28 August 2013
Contents
Gridka School slides
- Tools: GKS2013EffectiveAnalysisTools.pdf
- Templates: GKS2013EffectiveAnalysisTemplates.pdf
Polymorphism
#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];
}
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?