Kapitel 10
Alle Codedateien dieses Kapitels herunterladen
10_4_1_MitBestenReferenzen.cpp
/*
* Lösung für Übung 10.4.1 - Mit besten Referenzen
*
* - Vergessen Sie das "virtual" beim Destruktor nicht!
* - Die Konsolenausgabe wird so aussehen:
* A Konstruktor
* A als Referenz
* A ohne Referenz
* A Destruktor
* Programm fertig
* A Destruktor
* - Für die zweite Funktion wurde eine Kopie angelegt.
* Für diese Kopie wurde nicht der angegebene Konstruktor aufgerufen,
* (sondern ein automatischer Copy-Constructor) daher gibt es dort keine Ausgabe.
* - Allerdings wird ganz normal der Destruktor für das kopierte Objekt aufgerufen.
* Daher eine Destruktorausgabe für die Kopie und danach noch eine für das
* originale Objekt.
* - Sie können testweise auch den Zeiger des Objektes ausgeben lassen, damit sehen Sie noch
* besser, wann eine Kopie im Speicher angelegt wurde.
* Ersetzen Sie hierfür die beiden Stellen
* << name <<
* durch:
* << this <<
* und die beiden Stellen
* << param.name <<
* durch:
* << ¶m <<
*/
#include <iostream>
#include <string>
class ReferenceTester
{
public:
// Konstruktor
ReferenceTester(const std::string& name)
: name(name)
{
std::cout << name << " Konstruktor" << std::endl;
}
// Destruktor
virtual ~ReferenceTester()
{
std::cout << name << " Destruktor" << std::endl;
}
const std::string name;
};
void withReference(const ReferenceTester& param)
{
std::cout << param.name << " als Referenz" << std::endl;
}
void withoutReference(ReferenceTester param)
{
std::cout << param.name << " ohne Referenz" << std::endl;
}
int main()
{
ReferenceTester testObject("A");
withReference(testObject);
withoutReference(testObject);
std::cout << "Programm fertig" << std::endl;
return 0;
}
10_4_2_Gigafabrik.cpp
/*
* Lösung für Übung 10.4.2 - Gigafabrik
*/
#include <iostream>
#include <string>
class Car
{
public:
Car(const std::string modelName, int year)
: modelName(modelName), year(year)
{
}
void drive()
{
std::cout << modelName << " f\204hrt" << std::endl;
consumePower();
}
virtual void consumePower() = 0;
private:
const std::string modelName;
const int year;
};
class DieselCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
DieselCar(const std::string modelName, int year)
: Car(modelName, year)
{
}
void consumePower() override
{
std::cout << "Diesel verbraucht" << std::endl;
}
};
class ElectricCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
ElectricCar(const std::string modelName, int year)
: Car(modelName, year)
{
}
void consumePower() override
{
std::cout << "Strom verbraucht" << std::endl;
}
};
int main()
{
DieselCar firstCar("320d", 2018);
ElectricCar secondCar("320e", 2021);
firstCar.drive();
secondCar.drive();
return 0;
}
10_4_2_Gigafabrik_Bonus.cpp
/*
* Bonus-Lösung für Übung 10.4.2 - Gigafabrik
*
* Basiert auf 10_4_2_Gigafabrik.cpp, hinzugefügt wurde der Verbrauch pro 100km
*/
#include <iostream>
#include <string>
class Car
{
public:
Car(const std::string modelName, int year)
: modelName(modelName), year(year)
{
}
void drive()
{
std::cout << modelName << " f\204hrt" << std::endl;
consumePower();
}
virtual void consumePower() = 0;
private:
const std::string modelName;
const int year;
};
class DieselCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
DieselCar(const std::string modelName, int year, int litersPer100km)
: Car(modelName, year), litersPer100km(litersPer100km)
{
}
void consumePower() override
{
std::cout << litersPer100km << "l Diesel verbraucht" << std::endl;
}
private:
const int litersPer100km;
};
class ElectricCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
ElectricCar(const std::string modelName, int year, int kWhPer100km)
: Car(modelName, year), kWhPer100km(kWhPer100km)
{
}
void consumePower() override
{
std::cout << kWhPer100km << "kWh Strom verbraucht" << std::endl;
}
private:
const int kWhPer100km;
};
int main()
{
DieselCar firstCar("320d", 2018, 5);
ElectricCar secondCar("320e", 2021, 15);
firstCar.drive();
secondCar.drive();
return 0;
}
10_4_3_Teststrecke.cpp
/*
* Lösung für Übung 10.4.3 - Teststrecke
*/
#include <iostream>
#include <string>
#include <vector>
class Car
{
public:
Car(const std::string modelName, int year)
: modelName(modelName), year(year)
{
}
void drive()
{
std::cout << modelName << " f\204hrt" << std::endl;
consumePower();
}
virtual void consumePower() = 0;
private:
const std::string modelName;
const int year;
};
class DieselCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
DieselCar(const std::string modelName, int year, int litersPer100km)
: Car(modelName, year), litersPer100km(litersPer100km)
{
}
void consumePower() override
{
std::cout << litersPer100km << "l Diesel verbraucht" << std::endl;
}
private:
const int litersPer100km;
};
class ElectricCar : public Car
{
public:
// Konstruktor ruft den Konstruktor der Oberklasse auf
ElectricCar(const std::string modelName, int year, int kWhPer100km)
: Car(modelName, year), kWhPer100km(kWhPer100km)
{
}
void consumePower() override
{
std::cout << kWhPer100km << "kWh Strom verbraucht" << std::endl;
}
private:
const int kWhPer100km;
};
class TestTrack
{
public:
TestTrack(const std::vector<std::shared_ptr<Car>>& cars)
: cars(cars)
{
}
void startTests()
{
for (std::shared_ptr<Car> car : cars)
{
car->drive();
}
}
private:
std::vector<std::shared_ptr<Car>> cars;
};
int main()
{
std::vector<std::shared_ptr<Car>> testCars = {
std::make_shared<DieselCar>("320d", 2018, 5),
std::make_shared<ElectricCar>("320e", 2021, 15)
};
TestTrack testTrack(testCars);
testTrack.startTests();
return 0;
}