08_PTNR: Neuanfang Grundgerüst
This commit is contained in:
parent
b37de1bd06
commit
d0cd6d6a10
@ -1 +1,2 @@
|
||||
add_executable(08_PTRN_MP MP/Money.cpp MP/Money.h MP/Currency.cpp MP/Currency.h MP/main.cpp MP/BankAccount.cpp MP/BankAccount.h MP/Storage.cpp MP/Storage.h)
|
||||
add_executable(08_PTRN_MP MP/VehicleFactory.cpp MP/VehicleFactory.hpp MP/Vehicle.cpp MP/Vehicle.hpp MP/Car.cpp MP/Car.hpp MP/Truck.cpp MP/Truck.hpp MP/Logger.cpp MP/Logger.hpp MP/main.cpp)
|
||||
add_executable(08_PTRN_Testat Testat/main.cpp Testat/Money.cpp Testat/Money.h Testat/Logger.cpp Testat/Logger.hpp Testat/Currency.h Testat/BankAccount.cpp Testat/BankAccount.h)
|
@ -1,7 +0,0 @@
|
||||
#include <utility>
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "BankAccount.h"
|
||||
|
||||
BankAccount::BankAccount(std::string owner, Money money) : owner(std::move(owner)), money(money){}
|
@ -1,19 +0,0 @@
|
||||
#ifndef C_C_BANKACCOUNT_H
|
||||
#define C_C_BANKACCOUNT_H
|
||||
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Money.h"
|
||||
|
||||
class BankAccount {
|
||||
private:
|
||||
std::string owner;
|
||||
Money money;
|
||||
|
||||
public:
|
||||
BankAccount(std::string owner = "none", Money money = Money(0, Storage().USD));
|
||||
};
|
||||
|
||||
|
||||
#endif
|
@ -1,9 +0,0 @@
|
||||
#include <utility>
|
||||
|
||||
#include "Currency.h"
|
||||
|
||||
Currency::Currency(std::string name, float rate) : name(std::move(name)), rate(rate) {}
|
||||
|
||||
bool Currency::operator==(Currency ¤cy) {
|
||||
return name == currency.name;
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
#ifndef C_C_CURRENCY_H
|
||||
#define C_C_CURRENCY_H
|
||||
|
||||
|
||||
#include <string>
|
||||
|
||||
class Currency {
|
||||
public:
|
||||
std::string name;
|
||||
float rate;
|
||||
Currency(std::string name, float rate);
|
||||
bool operator==(Currency ¤cy);
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
@ -1,35 +0,0 @@
|
||||
#include <utility>
|
||||
|
||||
#include "Money.h"
|
||||
|
||||
Money::Money(float value, Currency currency) : value(value), currency(std::move(currency)) {}
|
||||
|
||||
Money Money::operator+(Money money) {
|
||||
return Money((this->value * this->currency.rate) + (money.value * money.currency.rate), this->currency);
|
||||
}
|
||||
|
||||
Money Money::operator-(Money money) {
|
||||
return Money(this->value - money.value, this->currency);
|
||||
}
|
||||
|
||||
Money Money::operator*(Money money) {
|
||||
return Money(this->value * money.value);
|
||||
}
|
||||
|
||||
Money Money::operator/(Money money) {
|
||||
return Money(this->value / money.value);
|
||||
}
|
||||
|
||||
const Money Money::operator++(int) {
|
||||
this->value++;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const Money Money::operator--(int) {
|
||||
this->value--;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool Money::operator==(Money &money) {
|
||||
return this->value == money.value && this ->currency == money.currency;
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
#ifndef C_C_MONEY_H
|
||||
#define C_C_MONEY_H
|
||||
|
||||
#include "Currency.h"
|
||||
#include "Storage.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Johannes Theiner <kontakt@joethei.xyz>
|
||||
* @since 0.0.1
|
||||
*/
|
||||
class Money {
|
||||
private:
|
||||
float value;
|
||||
Currency currency;
|
||||
public:
|
||||
explicit Money(float value = 0, Currency currency = Storage().currencies["USD"]);
|
||||
Money operator+(Money money);
|
||||
Money operator-(Money money);
|
||||
Money operator*(Money money);
|
||||
Money operator/(Money money);
|
||||
const Money operator++(int);
|
||||
const Money operator--(int);
|
||||
bool operator==(Money &money);
|
||||
};
|
||||
|
||||
#endif
|
@ -1 +0,0 @@
|
||||
#include "Storage.h"
|
@ -1,21 +0,0 @@
|
||||
#ifndef C_C_STORAGE_H
|
||||
#define C_C_STORAGE_H
|
||||
|
||||
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include "Currency.h"
|
||||
#include "BankAccount.h"
|
||||
|
||||
class Storage {
|
||||
public:
|
||||
std::unordered_map<std::string, BankAccount> accounts;
|
||||
static const Currency USD = Currency("US Dollar", 1);
|
||||
static const Currency EUR = Currency("Euro", 0.879699);
|
||||
static const Currency GBP = Currency("British Pound", 0.783667);
|
||||
static const Currency AUD = Currency("Australian Dollar", 1.36962);
|
||||
static const Currency CAD = Currency("Canadian Dollar", 1.33023);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
@ -1,13 +1,71 @@
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include "Car.hpp"
|
||||
#include "Truck.hpp"
|
||||
#include "Logger.hpp"
|
||||
#include "VehicleFactory.hpp"
|
||||
|
||||
#include "Currency.h"
|
||||
#include "BankAccount.h"
|
||||
#include "Storage.h"
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
Storage storage;
|
||||
void workOnCopy_naive(std::vector<Vehicle*> vehicles){
|
||||
std::vector<Vehicle*> tempVec;
|
||||
for (int i=0; i<vehicles.size(); i++){
|
||||
Vehicle * currentVehicle = vehicles[i];
|
||||
Car* carToCopy = dynamic_cast<Car*>(currentVehicle); // RTTI type check
|
||||
Truck* truckToCopy = dynamic_cast<Truck*>(currentVehicle);// may be nullptr
|
||||
if(carToCopy){
|
||||
tempVec.push_back(new Car(carToCopy->model(), carToCopy->maxWeight())); // type dependency to Car
|
||||
}else if(truckToCopy){
|
||||
tempVec.push_back(new Truck(truckToCopy->model(), truckToCopy->payload_kg())); // type dependecy
|
||||
}else{
|
||||
// TODO: what do we do here?
|
||||
// Did someone add a new class to the code base?
|
||||
return; // BUG: copies aren't free'd
|
||||
}
|
||||
}
|
||||
// work on copies ...
|
||||
// ...
|
||||
for(auto vehi : tempVec){
|
||||
std::cout << vehi->model() << " " << vehi->payload_kg() << " kg" << std::endl;
|
||||
}
|
||||
for (int i=0; i<tempVec.size(); i++){
|
||||
delete tempVec[i];
|
||||
}
|
||||
tempVec.clear();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
void workOnCopy_smart(std::vector<Vehicle*> vehicles){ // uses RAII, virtual ctor
|
||||
|
||||
class RAIIvector { // local RAII helper class
|
||||
public:
|
||||
std::vector<Vehicle*> tempVec;
|
||||
~RAIIvector(){
|
||||
for(auto vehi : tempVec){
|
||||
delete vehi;
|
||||
}
|
||||
tempVec.clear();
|
||||
}
|
||||
};
|
||||
RAIIvector rv;
|
||||
|
||||
for(auto vehi : vehicles){
|
||||
rv.tempVec.push_back(vehi->clone());
|
||||
}
|
||||
// work on copies ...
|
||||
// ...
|
||||
for(auto vehi : rv.tempVec){
|
||||
std::cout << vehi->model() << " " << vehi->payload_kg() << " kg" << std::endl;
|
||||
}
|
||||
// compiler WILL invoke RAIIvector::~RAIIvector() here
|
||||
}
|
||||
|
||||
storage.accounts.insert(BankAccount("Max Maier", Money(50, Storage().EUR)));
|
||||
}
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
std::vector<Vehicle*> vehicles;
|
||||
vehicles.push_back(vehicleForPayload("Volkswagen Golf", 900)); // use factory for construction
|
||||
vehicles.push_back(vehicleForPayload("Magirus Deutz", 18*1000));
|
||||
Logger::getInstance()->log("work naively", __FILE__, __LINE__);
|
||||
workOnCopy_naive(vehicles);
|
||||
Logger::getInstance()->log("work smartly", __FILE__, __LINE__);
|
||||
workOnCopy_smart(vehicles);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,71 +0,0 @@
|
||||
#include "Car.hpp"
|
||||
#include "Truck.hpp"
|
||||
#include "Logger.hpp"
|
||||
#include "VehicleFactory.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
void workOnCopy_naive(std::vector<Vehicle*> vehicles){
|
||||
std::vector<Vehicle*> tempVec;
|
||||
for (int i=0; i<vehicles.size(); i++){
|
||||
Vehicle * currentVehicle = vehicles[i];
|
||||
Car* carToCopy = dynamic_cast<Car*>(currentVehicle); // RTTI type check
|
||||
Truck* truckToCopy = dynamic_cast<Truck*>(currentVehicle);// may be nullptr
|
||||
if(carToCopy){
|
||||
tempVec.push_back(new Car(carToCopy->model(), carToCopy->maxWeight())); // type dependency to Car
|
||||
}else if(truckToCopy){
|
||||
tempVec.push_back(new Truck(truckToCopy->model(), truckToCopy->payload_kg())); // type dependecy
|
||||
}else{
|
||||
// TODO: what do we do here?
|
||||
// Did someone add a new class to the code base?
|
||||
return; // BUG: copies aren't free'd
|
||||
}
|
||||
}
|
||||
// work on copies ...
|
||||
// ...
|
||||
for(auto vehi : tempVec){
|
||||
std::cout << vehi->model() << " " << vehi->payload_kg() << " kg" << std::endl;
|
||||
}
|
||||
for (int i=0; i<tempVec.size(); i++){
|
||||
delete tempVec[i];
|
||||
}
|
||||
tempVec.clear();
|
||||
}
|
||||
|
||||
void workOnCopy_smart(std::vector<Vehicle*> vehicles){ // uses RAII, virtual ctor
|
||||
|
||||
class RAIIvector { // local RAII helper class
|
||||
public:
|
||||
std::vector<Vehicle*> tempVec;
|
||||
~RAIIvector(){
|
||||
for(auto vehi : tempVec){
|
||||
delete vehi;
|
||||
}
|
||||
tempVec.clear();
|
||||
}
|
||||
};
|
||||
RAIIvector rv;
|
||||
|
||||
for(auto vehi : vehicles){
|
||||
rv.tempVec.push_back(vehi->clone());
|
||||
}
|
||||
// work on copies ...
|
||||
// ...
|
||||
for(auto vehi : rv.tempVec){
|
||||
std::cout << vehi->model() << " " << vehi->payload_kg() << " kg" << std::endl;
|
||||
}
|
||||
// compiler WILL invoke RAIIvector::~RAIIvector() here
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
std::vector<Vehicle*> vehicles;
|
||||
vehicles.push_back(vehicleForPayload("Volkswagen Golf", 900)); // use factory for construction
|
||||
vehicles.push_back(vehicleForPayload("Magirus Deutz", 18*1000));
|
||||
Logger::getInstance()->log("work naively", __FILE__, __LINE__);
|
||||
workOnCopy_naive(vehicles);
|
||||
Logger::getInstance()->log("work smartly", __FILE__, __LINE__);
|
||||
workOnCopy_smart(vehicles);
|
||||
return 0;
|
||||
}
|
17
src/08_PTRN/Testat/BankAccount.cpp
Normal file
17
src/08_PTRN/Testat/BankAccount.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
//
|
||||
// Created by JThei on 01.12.2018.
|
||||
//
|
||||
|
||||
#include "BankAccount.h"
|
||||
|
||||
BankAccount::BankAccount(std::string name) : name(std::move(name)) {}
|
||||
|
||||
void BankAccount::add(Money _money) {
|
||||
money = money + _money;
|
||||
}
|
||||
|
||||
bool BankAccount::operator<(BankAccount a) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
23
src/08_PTRN/Testat/BankAccount.h
Normal file
23
src/08_PTRN/Testat/BankAccount.h
Normal file
@ -0,0 +1,23 @@
|
||||
//
|
||||
// Created by JThei on 01.12.2018.
|
||||
//
|
||||
|
||||
#ifndef C_C_BANKACCOUNTS_H
|
||||
#define C_C_BANKACCOUNTS_H
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
#include "Money.h"
|
||||
|
||||
class BankAccount {
|
||||
private:
|
||||
std::string name;
|
||||
Money money;
|
||||
public:
|
||||
explicit BankAccount(std::string name);
|
||||
void add(Money money);
|
||||
bool operator<(BankAccount a);
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_BANKACCOUNTS_H
|
17
src/08_PTRN/Testat/Currency.h
Normal file
17
src/08_PTRN/Testat/Currency.h
Normal file
@ -0,0 +1,17 @@
|
||||
//
|
||||
// Created by JThei on 01.12.2018.
|
||||
//
|
||||
|
||||
#ifndef C_C_CURRENCY_H
|
||||
#define C_C_CURRENCY_H
|
||||
|
||||
enum class Currency {
|
||||
USD=100,
|
||||
EUR=80,
|
||||
GPD=75
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //C_C_CURRENCY_H
|
15
src/08_PTRN/Testat/Logger.cpp
Normal file
15
src/08_PTRN/Testat/Logger.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
// file Logger.cpp
|
||||
#include "Logger.hpp"
|
||||
|
||||
Logger* Logger::_theInstance = nullptr;
|
||||
|
||||
Logger* Logger::getInstance(){
|
||||
if (!_theInstance){
|
||||
_theInstance = new StdoutLogger();
|
||||
}
|
||||
return _theInstance;
|
||||
}
|
||||
|
||||
void StdoutLogger::log(std::string message, std::string file, int line){
|
||||
std::cerr << message << " in " << file << " line " << line << std::endl;
|
||||
}
|
19
src/08_PTRN/Testat/Logger.hpp
Normal file
19
src/08_PTRN/Testat/Logger.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
// file Logger.hpp
|
||||
#ifndef Logger_hpp
|
||||
#define Logger_hpp
|
||||
|
||||
#include <iostream>
|
||||
|
||||
class Logger {
|
||||
static Logger* _theInstance;
|
||||
public:
|
||||
virtual void log(std::string message, std::string file="", int line=0) = 0;
|
||||
static Logger* getInstance();
|
||||
};
|
||||
|
||||
class StdoutLogger: public Logger {
|
||||
public:
|
||||
void log(std::string message, std::string file="", int line=0);
|
||||
};
|
||||
|
||||
#endif
|
37
src/08_PTRN/Testat/Money.cpp
Normal file
37
src/08_PTRN/Testat/Money.cpp
Normal file
@ -0,0 +1,37 @@
|
||||
//
|
||||
// Created by JThei on 01.12.2018.
|
||||
//
|
||||
|
||||
#include "Money.h"
|
||||
|
||||
Money::Money(int value, Currency currency) : value(value), currency(currency) {
|
||||
|
||||
}
|
||||
|
||||
Money Money::operator+(Money &a) {
|
||||
return Money();
|
||||
}
|
||||
|
||||
Money Money::operator-(Money &a) {
|
||||
return Money();
|
||||
}
|
||||
|
||||
const Money Money::operator++(int) {
|
||||
return Money();
|
||||
}
|
||||
|
||||
const Money Money::operator--(int) {
|
||||
return Money();
|
||||
}
|
||||
|
||||
bool Money::operator==(Money &a) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Money::operator!=(Money &a) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Currency Money::getCurrency() {
|
||||
return currency;
|
||||
}
|
28
src/08_PTRN/Testat/Money.h
Normal file
28
src/08_PTRN/Testat/Money.h
Normal file
@ -0,0 +1,28 @@
|
||||
//
|
||||
// Created by JThei on 01.12.2018.
|
||||
//
|
||||
|
||||
#ifndef C_C_MONEY_H
|
||||
#define C_C_MONEY_H
|
||||
|
||||
|
||||
#include "Currency.h"
|
||||
|
||||
class Money {
|
||||
private:
|
||||
int value;
|
||||
Currency currency;
|
||||
public:
|
||||
explicit Money(int value = 0, Currency currency = Currency::USD);
|
||||
Money operator+(Money &a);
|
||||
Money operator-(Money &a);
|
||||
const Money operator++(int);
|
||||
const Money operator--(int);
|
||||
bool operator==(Money &a);
|
||||
bool operator!=(Money &a);
|
||||
|
||||
Currency getCurrency();
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_MONEY_H
|
15
src/08_PTRN/Testat/main.cpp
Normal file
15
src/08_PTRN/Testat/main.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
|
||||
#include <set>
|
||||
#include "Currency.h"
|
||||
#include "BankAccount.h"
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
// std::set<BankAccount> accounts;
|
||||
//
|
||||
// accounts.insert(BankAccount("Max"));
|
||||
// accounts.insert(BankAccount("Max"));
|
||||
// accounts.insert(BankAccount("Marius"));
|
||||
// accounts.insert(BankAccount("Test"));
|
||||
}
|
Loading…
Reference in New Issue
Block a user