-
Notifications
You must be signed in to change notification settings - Fork 0
/
practica3.h
100 lines (84 loc) · 2.61 KB
/
practica3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# pragma once
# include "tipos.h"
using namespace std;
template <typename T>
class Filter : public Almacen<T>, public Carga {
private:
string texto;
public:
Filter(const double& _capacidad, const string& _texto)
: Almacen<T>(_capacidad), Carga("contenedor_estandar", _capacidad, 0), texto(_texto)
{ }
const double weight() const override {
double peso = 0;
for (auto elem : Almacen<T>::elemento) peso += elem->weight();
return peso;
}
const string to_string(string space = " ") const override {
ostringstream str;
str << space << "Contenedor [" << Filter<T>::capacidad << " m3] [" << Filter<T>::weight() << " kg] de "<< texto <<"\n";
for (const auto& e : Filter<T>::elemento)
str << e->to_string(space + " ");
return str.str();
}
};
// ----- Tipos Normales ------------------------------
class Producto : public Carga {
public:
Producto(const string& _nombre, const double& _volumen, const double& _peso)
: Carga(_nombre, _volumen, _peso) {}
};
template <typename T>
class Contenedor : public Filter<T> {
public:
Contenedor(const double& _capacidad)
: Filter<T>(_capacidad, "Carga Estandar") {}
};
class Camion : public Almacen<Carga>, public Item {
public:
Camion(const double& _capacidad)
: Almacen<Carga>(_capacidad), Item("Camion", _capacidad, 0)
{ }
const double weight() const override {
double peso = 0;
for (auto elem : Almacen::elemento) peso += elem->weight();
return peso;
}
const string to_string(string space = "") const override {
ostringstream str;
str << name() << " [" << this->capacidad << " m3] [" << weight() << " kg]\n";
for (const auto& e : Almacen::elemento) str << e->to_string(space + " ");
return str.str();
}
friend ostream& operator<<(ostream& f, const Camion& c) {
f << c.to_string();
return f;
}
};
// ----- Tipos Especiales ------------------------------
class SerVivo : public Item {
public:
SerVivo(const string& _nombre, const double& _volumen, const double& _peso)
: Item(_nombre, _volumen, _peso)
{ }
};
template <>
class Contenedor<SerVivo> : public Filter<SerVivo> {
public:
Contenedor(const double& _capacidad)
: Filter<SerVivo>(_capacidad, "Seres Vivos")
{ }
};
class Toxico : public Item {
public:
Toxico(const string& _nombre, const double& _volumen, const double& _peso)
: Item(_nombre, _volumen, _peso)
{ }
};
template <>
class Contenedor<Toxico> : public Filter<Toxico> {
public:
Contenedor(const double& _capacidad)
: Filter<Toxico>(_capacidad, "Productos Toxicos")
{ }
};