Kapitel 10
Alle Codedateien dieses Kapitels herunterladen
10_1_1_Destruktor.cpp
#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
#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
#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
#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
#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;
}