Kapitel 10

Alle Codedateien dieses Kapitels herunterladen

10_4_1_MitBestenReferenzen.cpp

Datei herunterladen

/*
 * 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:
 *     << &param <<
 */
#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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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

Datei herunterladen

/*
 * 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;
}