Kapitel 10

Alle Codedateien dieses Kapitels herunterladen

10_1_1_Destruktor.cpp

Datei herunterladen

#include <iostream>
#include <string>

class MyTest
{
 public:
  MyTest(const std::string& name)
    : name(name)
  {
    std::cout << name << " - Konstruktor" << std::endl;
  }
  virtual ~MyTest()
  {
    std::cout << name << " - Destruktor" << std::endl;
  }
 private:
  const std::string name;
};

int main()
{
  MyTest a("A");
  MyTest b("B");
  std::cout << "-- For-Schleife: --" << std::endl;
  for (int i = 0; i < 2; i++)
  {
    MyTest c("C" + std::to_string(i));
  }
  std::cout << "-- For-Schleife beendet --" << std::endl;
  return 0;
}

10_1_2_FilestreamDestruktor.cpp

Datei herunterladen

#include <fstream>
#include <iostream>
#include <string>

int main()
{
  const std::string filePath = "test.txt";
  std::ofstream outputFile(filePath);
  outputFile << "Eine Testausgabe";

  // outputFile.close();
  std::cout << "Datei geschrieben" << std::endl;

  // Mit zwei geschweiften Klammern einen eigenen
  // Gültigkeitsbereich eröffnen
  {
    std::ofstream sameOutputFile(filePath);
    sameOutputFile << "Eine zweite Testausgabe";
  }
  std::cout << "Datei nochmals geschrieben" << std::endl;

  return 0;
}

10_2_1_ZeigerUndVirtuelleMethoden.cpp

Datei herunterladen

#include <iostream>
#include <vector>
#include <memory>

class Animal
{
 public:
  virtual void eat()
  {
    std::cout << "Tier isst" << std::endl;
  }
};

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

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

class Worm : public Animal
{
};

int main()
{
  std::vector<std::shared_ptr<Animal>> zoo = {
    std::make_shared<Cat>(),
    std::make_shared<Mouse>(),
    std::make_shared<Worm>()
  };
  for (std::shared_ptr<Animal> animal : zoo)
  {
    animal->eat();
  }
  return 0;
}

10_2_2_FehlendesVirtual.cpp

Datei herunterladen

#include <iostream>
#include <vector>
#include <memory>

class Animal
{
 public:
  void eat()
  {
    std::cout << "Tier isst" << std::endl;
  }
};

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

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

class Worm : public Animal
{
};

int main()
{
  std::vector<std::shared_ptr<Animal>> zoo = {
    std::make_shared<Cat>(),
    std::make_shared<Mouse>(),
    std::make_shared<Worm>()
  };
  for (std::shared_ptr<Animal> animal : zoo)
  {
    animal->eat();
  }
  return 0;
}

10_3_AbstrakteKlasse.cpp

Datei herunterladen

#include <iostream>
#include <vector>
#include <memory>

class Animal
{
 public:
  virtual void eat() = 0;
};

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

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

/*
 Die Version voller Compilerfehler
   error C2259: "Animal": Abstrakte Klasse kann
   nicht erstellt werden.

 Entfernen Sie den Blockkommentar, um die Fehler
 selbst zu sehen


class Worm : public Animal
{
};

int main()
{
  // Die Standardimplementierung der Oberklasse
  Animal tier;     // <- Compilerfehler
  tier.eat();

  // Jeweils eine eigene Implementierung
  Cat cat;
  cat.eat();
  Mouse mouse;
  mouse.eat();

  // Nochmals die Standardimplementierung der Oberklasse
  Worm worm;       // <- Compilerfehler
  worm.eat();

	                 // v---- Compilerfehler
  std::vector<Animal> zoo = { Animal(), Cat(), Mouse() };
  for (Animal& animal : zoo)
  {
    animal.eat();
  }
  return 0;
}

*/

class Worm : public Animal
{
 public:
  void eat() override
  {
    std::cout << "Wurm frisst Kompost" << std::endl;
  }
};

int main()
{
  Cat cat;
  cat.eat();
  Mouse mouse;
  mouse.eat();
  Worm worm;
  worm.eat();

  std::vector<std::shared_ptr<Animal>> zoo = {
    std::make_shared<Cat>(),
    std::make_shared<Mouse>(),
    std::make_shared<Worm>()
  };
  for (std::shared_ptr<Animal> animal : zoo)
  {
    animal->eat();
  }
  return 0;
}