Kapitel 7

Alle Codedateien dieses Kapitels herunterladen

07_5_1_Fuhrpark.cpp

Datei herunterladen

/*
 * Lösung für Übung 7.5.1 - Fuhrpark
 *
 * In der Wahl der Klassennamen haben Sie natürlich mehrere Möglichkeiten.
 * Wichtig ist nur, dass die Benennung inhaltlich Sinn ergibt.
 * So wäre zum Beispiel "Banana" als Oberklasse von Cabrio und Van unlogisch.
 */
#include <iostream>
#include <string>

class Vehicle
{
};

class Bike : public Vehicle
{
};

class MotorBike : public Bike
{
};

class Bicycle : public Bike
{
};

class Car : public Vehicle
{
};

class Cabrio : public Car
{
};

class Van : public Car
{
};

// Für die dritte Unterklasse von Vehicle gibt es viele Möglichkeiten.
// Eine davon wäre das Boot.
class Boat : public Vehicle
{
};

int main()
{
  Vehicle vehicle;
  Bike bike;
  MotorBike motorBike;
  Bicycle bicycle;
  Car car;
  Cabrio cabrio;
  Van van;
  return 0;
}

07_5_2_TierHierarchie.cpp

Datei herunterladen

/*
 * Lösung für Übung 7.5.2 - Tierhierarchie
 */
#include <iostream>
#include <string>

class Animal
{
 public:
  Animal(const std::string& name)
    : name(name)
  {}
  virtual void eat() const
  {
    std::cout << name << " isst" << std::endl;
  }
  void rename(const std::string& newName)
  {
    name = newName;
  }
  std::string getName()
  {
    return name;
  }
 protected:
  std::string name;
};

class Cat : public Animal
{
 public:
  Cat(const std::string& name)
    : Animal(name)
  {
  }
  void eat() const override
  {
    std::cout << "Katze " << name << " isst eine Maus" << std::endl;
  }
};

class Mouse : public Animal
{
 public:
  Mouse(const std::string& name)
    : Animal(name)
  {
  }
  void eat() const override
  {
    std::cout << "Maus " << name << " isst K\204se" << std::endl;
  }
};

int main()
{
  // Die Katzen sind als Konstanten definiert
  const Cat mia("Mia");
  const Cat carlo("Carlo");
  mia.eat();
  carlo.eat();

  // Eine nicht-konstante Maus
  Mouse mouse("Philipp");
  mouse.eat();
  std::cout << "Maus " << mouse.getName();
  mouse.rename("Despereaux");
  std::cout << " hei\341t nun " << mouse.getName();
  return 0;
}

07_5_3_DigitalesWarenhaus.cpp

Datei herunterladen

/*
 * Lösung für Übung 7.5.3 - Digitales Warenhaus
 */
#include <iostream>
#include <string>

struct Date
{
  // Sie können Standardparameter für den Konstuktor verwenden, sodass Sie auch
  // ein "leeres" Datum leicht anlegen können
  Date(int day = 0, int month = 0, int year = 0)
    : day(day), month(month), year(year)
  {
  }
  int day = 0;
  int month = 0;
  int year = 0;
  // Hilfreich zur testweisen Konsolenausgabe
  std::string toString()
  {
    return std::to_string(day) + "." + std::to_string(month) + "." + std::to_string(year);
  }
};

class Article
{
 public:
  Article(const std::string& name, double price)
    : name(name), price(price)
  {
  }
  std::string getName()
  {
    return name;
  }
  double getPrice()
  {
    return price;
  }
  virtual void sell(const Date& currentDate)
  {
    std::cout << name << " verkauft" << std::endl;
  }
 private:
  std::string name;
  double price;
};

class FoodArticle : public Article
{
 public:
  FoodArticle(const std::string& name, double price, const Date& expirationDate)
    : Article(name, price), expirationDate(expirationDate)
  {
  }
  Date getExpirationDate()
  {
    return expirationDate;
  }
 private:
  Date expirationDate;
};

class TechArticle : public Article
{
 public:
  TechArticle(const std::string& name, double price, int yearsOfWarranty)
    : Article(name, price), yearsOfWarranty(yearsOfWarranty)
  {
  }
  int getYearsOfWarranty()
  {
    return yearsOfWarranty;
  }
  Date getWarrantyExpirationDate()
  {
    return warrantyExpirationDate;
  }
  void sell(const Date& currentDate) override
  {
    std::cout << getName() << " verkauft" << std::endl;
    warrantyExpirationDate = currentDate;
    warrantyExpirationDate.year += yearsOfWarranty;
  }
 private:
  int yearsOfWarranty = 0;
  // Das Ablaufdatum wird erst beim Verkauf gesetzt.
  Date warrantyExpirationDate;
};

int main()
{
  TechArticle laptop("Thinkpad", 799, 3);
  TechArticle freezer("Arktis 3000", 1200, 5);
  FoodArticle milk("Vollmilch", 1.38, Date(25, 5, 2021));

  const Date today(4, 5, 2021);
  laptop.sell(today);
  freezer.sell(today);
  milk.sell(today);

  std::cout << "Der Laptop hat Garantie bis zum "
    << laptop.getWarrantyExpirationDate().toString() << std::endl;

  std::cout << "Der K\201hlschrank hat Garantie bis zum "
    << freezer.getWarrantyExpirationDate().toString() << std::endl;
  return 0;
}

07_5_4_Preismacht.cpp

Datei herunterladen

/*
 * Lösung für Übung 7.5.4 - Preismacht
 */
#include <iostream>
#include <string>

struct Date
{
  // Sie können Standardparameter für den Konstuktor verwenden, sodass Sie auch
  // ein "leeres" Datum leicht anlegen können
  Date(int day = 0, int month = 0, int year = 0)
    : day(day), month(month), year(year)
  {
  }
  int day = 0;
  int month = 0;
  int year = 0;
  // Hilfreich zur testweisen Konsolenausgabe
  std::string toString()
  {
    return std::to_string(day) + "." + std::to_string(month) + "." + std::to_string(year);
  }
};

class Article
{
 public:
  Article(const std::string& name, double price)
    : name(name), price(price)
  {
  }
  std::string getName()
  {
    return name;
  }
  double getPrice()
  {
    return price;
  }
  void setPrice(double newPrice)
  {
    if (newPrice <= 0)
    {
      std::cout << "Preis nicht valide!" << std::endl;
      // Der Preis wird nicht geändert
      return;
    }
    price = newPrice;
  }
  virtual void sell(const Date& currentDate)
  {
    std::cout << name << " verkauft" << std::endl;
  }
 private:
  std::string name;
  double price;
};

class FoodArticle : public Article
{
public:
  FoodArticle(const std::string& name, double price, const Date& expirationDate)
    : Article(name, price), expirationDate(expirationDate)
  {
  }
  Date getExpirationDate()
  {
    return expirationDate;
  }
 private:
  Date expirationDate;
};

class TechArticle : public Article
{
 public:
  TechArticle(const std::string& name, double price, int yearsOfWarranty)
    : Article(name, price), yearsOfWarranty(yearsOfWarranty)
  {
  }
  int getYearsOfWarranty()
  {
    return yearsOfWarranty;
  }
  Date getWarrantyExpirationDate()
  {
    return warrantyExpirationDate;
  }
  void sell(const Date& currentDate) override
  {
    std::cout << getName() << " verkauft" << std::endl;
    warrantyExpirationDate = currentDate;
    warrantyExpirationDate.year += yearsOfWarranty;
  }
 private:
  int yearsOfWarranty = 0;
  // Das Ablaufdatum wird erst beim Verkauf gesetzt.
  Date warrantyExpirationDate;
};

int main()
{
  TechArticle laptop("Thinkpad", 799, 3);
  TechArticle freezer("Arktis 3000", 1200, 5);
  FoodArticle milk("Vollmilch", 1.38, Date(25, 5, 2021));

  const Date today(4, 5, 2021);
  laptop.sell(today);
  freezer.sell(today);
  milk.sell(today);

  std::cout << "Der Laptop hat Garantie bis zum "
    << laptop.getWarrantyExpirationDate().toString() << std::endl;

  std::cout << "Der K\201hlschrank hat Garantie bis zum "
    << freezer.getWarrantyExpirationDate().toString() << std::endl;
  return 0;
}