Website Summary Files Commits Branches @commit @diff @stats
path: root / Week10 / Exercise02 / Vehicle.h
blob: 206e1b509a1d61f4de827cd854c0aa887de4d934 (plain) (blame)
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
#ifndef _VEHICLE
#define _VEHICLE

#include <istream>
#include <ostream>

const unsigned MODEL_LENGTH = 1024;

class Vehicle {
	char model[MODEL_LENGTH];
	unsigned yearOfManufacture;
	double mileage;
	unsigned short ecoCategory;
	double weight;
	double horsePower;


public:
	Vehicle();

	const char* GetModel() const;
	void SetModel(char model[MODEL_LENGTH]);

	unsigned GetYearOfManufacture() const;
	void SetYearOfManufacture(unsigned yearOfManufacture);

	double GetMileage() const;
	void SetMileage(double mileage);

	unsigned short GetEcoCategory() const;
	void SetEcoCategory(unsigned short ecoCategory);

	double GetWeight() const;
	void SetWeight(double weight);

	double GetHorsePower() const;
	void SetHorsePower(double horsePower);

	// Имаме всички нужни селектори и мутатори, за да не се нуждаем
	// от това операторите да са friend. Но въпреки това ще го
	// имплементираме така.

	friend std::ostream& operator<<(std::ostream& ostr, const Vehicle& vehicle);
	friend std::istream& operator>>(std::istream& istr, Vehicle& vehicle);

	// След като създадем динамично-заделен обект от
	// клас наследник, можем да конвертираме указателя към
	// базовия клас (т.е. CombustionVehicle* да стане Vehicle*).
	// В този случай, ще имаме налични само нещата, които са
	// достъпни във Vehicle, включително деструктора.
	//
	// Но CombustionVehicle има още член-данни, как ще разберем,
	// че Vehicle* е всъщност CombustionVehicle*?
	// Коректното решение, като стигнем до там, е да използваме
	// виртуални деструктури.
	//
	// Текущото решение, което можем да направим, е да запазваме
	// някаква допълнителна стойност, която е различна спрямо
	// конкретния клас (наследник). След това ще правим проверки по
	// нея, дали съответства на тази на даден клас, и ако да, конвертираме.
protected:
	unsigned type;
};


#endif /* _VEHICLE */