-
Notifications
You must be signed in to change notification settings - Fork 90
Expand file tree
/
Copy pathexercise5.cpp
More file actions
111 lines (95 loc) · 3.11 KB
/
exercise5.cpp
File metadata and controls
111 lines (95 loc) · 3.11 KB
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
101
102
103
104
105
106
107
108
109
110
111
#include <string>
class Cargo {
public:
Cargo() = default;
Cargo(size_t amount, std::string name, size_t base_price);
virtual ~Cargo() = default;
virtual size_t getPrice() const = 0;
virtual std::string getName() const = 0;
virtual size_t getAmount() const = 0;
virtual size_t getBasePrice() const = 0;
virtual Cargo& operator+=(size_t amount) = 0;
virtual Cargo& operator-=(size_t amount) = 0;
protected:
std::string name_;
size_t amount_;
size_t base_price_;
};
class Fruit : public Cargo {
public:
Fruit(size_t amount, const std::string& name, size_t base_price, size_t expiry_date, size_t time_elapsed);
~Fruit() override;
// override from Cargo
size_t getPrice() const override {
if (time_elapsed_ >= expiry_date_)
return 0;
return static_cast<size_t>(
base_price_ * ((float)(expiry_date_ - time_elapsed_)) / expiry_date_);
}
std::string getName() const override { return name_; }
size_t getAmount() const override { return amount_; }
size_t getBasePrice() const override { return base_price_; }
Cargo& operator--() {
--amount_;
return *this;
}
Cargo& operator+=(size_t amount) {
amount_ += amount;
return *this;
}
Cargo& operator-=(size_t amount) {
amount_ -= amount;
return *this;
}
size_t getTimeElapsed() const { return time_elapsed_; }
size_t getExpiryDate() const { return expiry_date_; }
private:
size_t time_elapsed_{0};
size_t expiry_date_;
};
class Alcohol : public Cargo {
public:
Alcohol(size_t amount, const std::string& name, size_t base_price, size_t percentage);
~Alcohol() override = default;
// override from Cargo
size_t getPrice() const override { return base_price_ * percentage_ / 96; }
std::string getName() const override { return name_; }
size_t getAmount() const override { return amount_; }
size_t getBasePrice() const override { return base_price_; }
Cargo& operator+=(size_t amount) {
amount_ += amount;
return *this;
}
Cargo& operator-=(size_t amount) {
amount_ -= amount;
return *this;
}
size_t getPercentage() const { return percentage_; }
private:
size_t percentage_;
};
class Item : public Cargo {
public:
enum class Rarity { common = 1,
rare = 3,
epic = 6,
legendary = 10 };
Item(size_t amount, const std::string& name, size_t base_price, Rarity rarity);
~Item() override = default;
// override from Cargo
size_t getPrice() const override { return base_price_ * static_cast<int>(rarity_); }
std::string getName() const override { return name_; }
size_t getAmount() const override { return amount_; }
size_t getBasePrice() const override { return base_price_; }
Cargo& operator+=(size_t amount) {
amount_ += amount;
return *this;
}
Cargo& operator-=(size_t amount) {
amount_ -= amount;
return *this;
}
Rarity getRarity() const { return rarity_; }
private:
Rarity rarity_;
};