05_OOb: Anfang Bearbeitung MP
This commit is contained in:
parent
72b7ae9a7d
commit
8d01cff127
|
@ -1,31 +1,7 @@
|
|||
add_executable(05_OOb_MP
|
||||
MP/shapes_main.cpp
|
||||
MP/Shape.cpp
|
||||
MP/Position.h
|
||||
MP/Shape.h
|
||||
MP/Point.cpp
|
||||
MP/Point.h
|
||||
MP/Circle.cpp
|
||||
MP/Circle.h
|
||||
MP/Rectangle.cpp
|
||||
MP/Rectangle.h
|
||||
MP/Scene.cpp
|
||||
MP/Scene.h
|
||||
../../helpers/AnsiConsole.cpp
|
||||
MP/main_mp4_OO_b.cpp
|
||||
)
|
||||
|
||||
add_executable(05_OOb_Testat
|
||||
Testat/shapes_main.cpp
|
||||
Testat/Shape.cpp
|
||||
Testat/Position.h
|
||||
Testat/Shape.h
|
||||
Testat/Point.cpp
|
||||
Testat/Point.h
|
||||
Testat/Circle.cpp
|
||||
Testat/Circle.h
|
||||
Testat/Rectangle.cpp
|
||||
Testat/Rectangle.h
|
||||
Testat/Scene.cpp
|
||||
Testat/Scene.h
|
||||
../../helpers/AnsiConsole.cpp
|
||||
Testat/main_mp4_OO_b.cpp
|
||||
)
|
|
@ -1,26 +0,0 @@
|
|||
#include "Circle.h"
|
||||
#include <cmath>
|
||||
|
||||
Circle::Circle(int x, int y, int radius, Colors color) : Shape(Position(x, y), color) {
|
||||
_radius = radius;
|
||||
}
|
||||
|
||||
void Circle::draw() {
|
||||
/* see https://de.wikibooks.org/wiki/Formelsammlung_Mathematik:_Geometrie
|
||||
* Höhensatz des Euklid
|
||||
* */
|
||||
int x_start = position.x - _radius / 2;
|
||||
int x_stop = position.x + _radius / 2;
|
||||
|
||||
for (int i = x_start; i <= x_stop; i++) {
|
||||
double x_relative = double(i) - double(x_start);
|
||||
double h = sqrt(x_relative * (x_stop - x_start - x_relative));
|
||||
ansiConsole.printText(position.x + int(x_relative) - _radius / 2,
|
||||
static_cast<int>(position.y + h), "#",
|
||||
color);
|
||||
ansiConsole.printText(position.x + int(x_relative) - _radius / 2,
|
||||
static_cast<int>(position.y - h), "#",
|
||||
color);
|
||||
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_CIRCLE_H
|
||||
#define C_C_CIRCLE_H
|
||||
|
||||
#include "Shape.h"
|
||||
|
||||
class Circle : public Shape{
|
||||
protected:
|
||||
int _radius;
|
||||
public:
|
||||
explicit Circle(int x = 0, int y = 0, int radius = 0, Colors color = Colors::GREEN);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
#endif //C_C_CIRCLE_H
|
|
@ -1,8 +0,0 @@
|
|||
#include "Point.h"
|
||||
|
||||
Point::Point(int x, int y, Colors color) : Shape(Position(x, y), color) {
|
||||
}
|
||||
|
||||
void Point::draw() {
|
||||
ansiConsole.printText(position.x, position.y, "*", color);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_POINT_H
|
||||
#define C_C_POINT_H
|
||||
|
||||
#include "Shape.h"
|
||||
|
||||
class Point : public Shape{
|
||||
|
||||
public:
|
||||
explicit Point(int x, int y, Colors color);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_POSITION_H
|
||||
#define C_C_POSITION_H
|
||||
|
||||
struct Position {
|
||||
int x;
|
||||
int y;
|
||||
|
||||
explicit Position(int x_ = 0, int y_ = 0) {
|
||||
x = x_;
|
||||
y = y_;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,23 +0,0 @@
|
|||
#include "Rectangle.h"
|
||||
|
||||
Rectangle::Rectangle(int x, int y, int width, int height, Colors color) : Shape(Position(x, y), color) {
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
}
|
||||
|
||||
void Rectangle::draw() {
|
||||
int x_start = position.x - (width / 2);
|
||||
int x_stop = position.x + (width / 2);
|
||||
|
||||
int y_start = position.y - (height / 2);
|
||||
int y_stop = position.y + (height / 2);
|
||||
|
||||
for(int i = x_start; i <= x_stop; i++) {
|
||||
ansiConsole.printText(i, position.y - (height / 2), "#", color);
|
||||
ansiConsole.printText(i, position.y + (height / 2), "#", color);
|
||||
}
|
||||
for(int i = y_start; i< y_stop; i++) {
|
||||
ansiConsole.printText(position.x + (width / 2), i, "#", color);
|
||||
ansiConsole.printText(position.x - (width / 2), i, "#", color);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
#include "Shape.h"
|
||||
|
||||
#ifndef C_C_RECTANGLE_H
|
||||
#define C_C_RECTANGLE_H
|
||||
|
||||
|
||||
class Rectangle : public Shape{
|
||||
protected:
|
||||
int width;
|
||||
int height;
|
||||
|
||||
public:
|
||||
explicit Rectangle(int x = 0, int y = 0, int width = 0, int height = 0, Colors color = Colors::WHITE);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_RECTANGLE_H
|
|
@ -1,19 +0,0 @@
|
|||
#include "Scene.h"
|
||||
#include <vector>
|
||||
|
||||
Scene::Scene(std::vector<Shape*> shapes) : shapes(std::move(shapes)) {
|
||||
|
||||
}
|
||||
|
||||
void Scene::draw() {
|
||||
ansiConsole.clearScreen();
|
||||
for(Shape* shape : shapes) {
|
||||
shape->draw();
|
||||
}
|
||||
}
|
||||
|
||||
Scene::~Scene() {
|
||||
for(Shape* shape : shapes) {
|
||||
delete shape;
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
#include <vector>
|
||||
#include "Shape.h"
|
||||
|
||||
#ifndef C_C_SCENE_H
|
||||
#define C_C_SCENE_H
|
||||
|
||||
class Scene {
|
||||
private:
|
||||
std::vector<Shape*> shapes;
|
||||
public:
|
||||
explicit Scene(std::vector<Shape*> shapes);
|
||||
void draw();
|
||||
~Scene();
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_SCENE_H
|
|
@ -1,9 +0,0 @@
|
|||
#include "Position.h"
|
||||
#include "Shape.h"
|
||||
|
||||
Shape::Shape(Position position, Colors color) {
|
||||
this->position = position;
|
||||
this->color = color;
|
||||
}
|
||||
|
||||
Shape::~Shape() = default;
|
|
@ -1,17 +0,0 @@
|
|||
#ifndef C_C_SHAPE_H
|
||||
#define C_C_SHAPE_H
|
||||
|
||||
#include "../../../helpers/AnsiConsole.h"
|
||||
#include "Position.h"
|
||||
|
||||
class Shape {
|
||||
protected:
|
||||
Position position;
|
||||
Colors color;
|
||||
public:
|
||||
Shape(Position position, Colors color);
|
||||
virtual ~Shape();
|
||||
virtual void draw() = 0;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,220 @@
|
|||
// file main_mp4_OO_b.cpp
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
//=======================================
|
||||
|
||||
struct FooVal {
|
||||
FooVal(int initialValue=0);
|
||||
~FooVal();
|
||||
private:
|
||||
int _someValue;
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class FooBase {
|
||||
FooVal _value;
|
||||
public:
|
||||
FooBase();
|
||||
FooBase(int initialValue);
|
||||
virtual ~FooBase();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class FooDerived : public FooBase {
|
||||
int _ival;
|
||||
public:
|
||||
FooDerived(int initialValue);
|
||||
~FooDerived();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class Bar {
|
||||
FooBase *_helperObject;
|
||||
public:
|
||||
Bar();
|
||||
~Bar();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
FooVal::FooVal(int initialValue)
|
||||
: _someValue(initialValue)
|
||||
{
|
||||
std::cout << "FooVal::FooVal()" << std::endl;
|
||||
}
|
||||
|
||||
FooVal::~FooVal(){
|
||||
std::cout << "FooVal::~FooVal()" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::FooBase(){
|
||||
std::cout << "FooBase::FooBase()" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::FooBase(int initialValue)
|
||||
: _value(initialValue)
|
||||
{
|
||||
std::cout << "FooBase::FooBase(int)" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::~FooBase(){
|
||||
std::cout << "FooBase::~FooBase(" << std::endl;
|
||||
}
|
||||
|
||||
FooDerived::FooDerived(int initialValue)
|
||||
: FooBase(initialValue), _ival(0)
|
||||
{
|
||||
std::cout << "FooDerived::FooDerived()" << std::endl;
|
||||
}
|
||||
|
||||
FooDerived::~FooDerived(){
|
||||
std::cout << "FooDerived::~FooDerived()" << std::endl;
|
||||
}
|
||||
|
||||
Bar::Bar(){
|
||||
_helperObject = new FooDerived(0);
|
||||
}
|
||||
|
||||
Bar::~Bar(){
|
||||
delete _helperObject;
|
||||
}
|
||||
|
||||
|
||||
struct StackObject {
|
||||
private:
|
||||
void* operator new(size_t size) noexcept {
|
||||
bool noStackObjectOnHeap = false;
|
||||
assert(noStackObjectOnHeap);
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct A : public StackObject {
|
||||
A(){std::cout << "+A ";}
|
||||
//A(const A&){std::cout << "+A";}
|
||||
~A(){std::cout << "-A ";}
|
||||
};
|
||||
|
||||
struct B : public StackObject {
|
||||
B(){std::cout << "+B ";}
|
||||
//B(const B&){std::cout << "+B";}
|
||||
~B(){std::cout << "-B ";}
|
||||
};
|
||||
|
||||
|
||||
struct C : public StackObject {
|
||||
C(){std::cout << "+C ";}
|
||||
//C(const C&){std::cout << "+C";}
|
||||
~C(){std::cout << "-C ";}
|
||||
};
|
||||
|
||||
class HeapObject{
|
||||
public:
|
||||
void* operator new (size_t size);
|
||||
HeapObject();
|
||||
virtual ~HeapObject();
|
||||
static bool assertionsHold();
|
||||
protected:
|
||||
private:
|
||||
static int ctorCount;
|
||||
static int dtorCount;
|
||||
static int newCount;
|
||||
// static void remove(HeapObject *);
|
||||
HeapObject(const HeapObject&) = delete;
|
||||
HeapObject& operator=(const HeapObject&) = delete;
|
||||
};
|
||||
|
||||
int HeapObject::ctorCount = 0;
|
||||
int HeapObject::dtorCount = 0;
|
||||
int HeapObject::newCount = 0;
|
||||
|
||||
void* HeapObject::operator new (size_t size){
|
||||
newCount++;
|
||||
return new char[size];
|
||||
}
|
||||
|
||||
HeapObject::HeapObject(){
|
||||
ctorCount++;
|
||||
}
|
||||
|
||||
HeapObject::~HeapObject(){
|
||||
dtorCount++;
|
||||
}
|
||||
|
||||
bool HeapObject::assertionsHold(){
|
||||
assert(ctorCount == newCount); // all objects have been allocated on heap
|
||||
assert(ctorCount == dtorCount); // all objects have been deleted
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
class K : public HeapObject
|
||||
{
|
||||
public:
|
||||
K(){std::cout << "+K ";}
|
||||
~K(){std::cout << "-K ";}
|
||||
};
|
||||
|
||||
class L {
|
||||
public:
|
||||
L(){std::cout << "+L ";}
|
||||
~L(){std::cout << "-L ";}
|
||||
};
|
||||
|
||||
|
||||
class M {
|
||||
public:
|
||||
M(){std::cout << "+M ";}
|
||||
~M(){std::cout << "-M ";}
|
||||
};
|
||||
|
||||
void pattern1() {
|
||||
B b;
|
||||
{
|
||||
C c;
|
||||
}
|
||||
A a;
|
||||
}
|
||||
|
||||
void pattern2() {
|
||||
B b;
|
||||
C c;
|
||||
A a;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
|
||||
Bar * bar = new Bar();
|
||||
// ...
|
||||
delete bar; // implies "delete _helperObject";
|
||||
|
||||
FooBase *obj = new FooDerived(7);
|
||||
delete obj;
|
||||
|
||||
{
|
||||
C c;
|
||||
K* k = new K();
|
||||
delete k;
|
||||
}
|
||||
|
||||
HeapObject::assertionsHold();
|
||||
std::cout << " ENDE" << std::endl;
|
||||
|
||||
pattern1();
|
||||
std::cout << std::endl;
|
||||
pattern2();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
#include <vector>
|
||||
#include "Shape.h"
|
||||
#include "Point.h"
|
||||
#include "Circle.h"
|
||||
#include "Rectangle.h"
|
||||
#include "Scene.h"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
std::vector<Shape*> shapes;
|
||||
|
||||
shapes.push_back(new Point(30, 10, Colors::RED));
|
||||
shapes.push_back(new Point(28, 8, Colors::BLUE));
|
||||
shapes.push_back(new Point(32, 8, Colors::BLUE));
|
||||
|
||||
|
||||
shapes.push_back(new Circle(30, 10, 10, Colors::WHITE));
|
||||
shapes.push_back(new Circle(30, 20, 15, Colors::GREEN));
|
||||
|
||||
|
||||
shapes.push_back(new Rectangle(5, 21, 10, 10, Colors::MAGENTA));
|
||||
|
||||
shapes.push_back(new Point(5, 10, Colors::WHITE));
|
||||
shapes.push_back(new Point(15, 7, Colors::WHITE));
|
||||
shapes.push_back(new Point(7, 5, Colors::WHITE));
|
||||
|
||||
|
||||
auto *s = new Scene(shapes);
|
||||
s->draw();
|
||||
|
||||
delete s;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
#include "Circle.h"
|
||||
#include <cmath>
|
||||
|
||||
Circle::Circle(int x, int y, int radius, Colors color) : Shape(Position(x, y), color) {
|
||||
_radius = radius;
|
||||
}
|
||||
|
||||
void Circle::draw() {
|
||||
/* see https://de.wikibooks.org/wiki/Formelsammlung_Mathematik:_Geometrie
|
||||
* Höhensatz des Euklid
|
||||
* */
|
||||
int x_start = position.x - _radius / 2;
|
||||
int x_stop = position.x + _radius / 2;
|
||||
|
||||
for (int i = x_start; i <= x_stop; i++) {
|
||||
double x_relative = double(i) - double(x_start);
|
||||
double h = sqrt(x_relative * (x_stop - x_start - x_relative));
|
||||
ansiConsole.printText(position.x + int(x_relative) - _radius / 2,
|
||||
static_cast<int>(position.y + h), "#",
|
||||
color);
|
||||
ansiConsole.printText(position.x + int(x_relative) - _radius / 2,
|
||||
static_cast<int>(position.y - h), "#",
|
||||
color);
|
||||
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_CIRCLE_H
|
||||
#define C_C_CIRCLE_H
|
||||
|
||||
#include "Shape.h"
|
||||
|
||||
class Circle : public Shape{
|
||||
protected:
|
||||
int _radius;
|
||||
public:
|
||||
explicit Circle(int x = 0, int y = 0, int radius = 0, Colors color = Colors::GREEN);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
#endif //C_C_CIRCLE_H
|
|
@ -1,8 +0,0 @@
|
|||
#include "Point.h"
|
||||
|
||||
Point::Point(int x, int y, Colors color) : Shape(Position(x, y), color) {
|
||||
}
|
||||
|
||||
void Point::draw() {
|
||||
ansiConsole.printText(position.x, position.y, "*", color);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_POINT_H
|
||||
#define C_C_POINT_H
|
||||
|
||||
#include "Shape.h"
|
||||
|
||||
class Point : public Shape{
|
||||
|
||||
public:
|
||||
explicit Point(int x, int y, Colors color);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef C_C_POSITION_H
|
||||
#define C_C_POSITION_H
|
||||
|
||||
struct Position {
|
||||
int x;
|
||||
int y;
|
||||
|
||||
explicit Position(int x_ = 0, int y_ = 0) {
|
||||
x = x_;
|
||||
y = y_;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,23 +0,0 @@
|
|||
#include "Rectangle.h"
|
||||
|
||||
Rectangle::Rectangle(int x, int y, int width, int height, Colors color) : Shape(Position(x, y), color) {
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
}
|
||||
|
||||
void Rectangle::draw() {
|
||||
int x_start = position.x - (width / 2);
|
||||
int x_stop = position.x + (width / 2);
|
||||
|
||||
int y_start = position.y - (height / 2);
|
||||
int y_stop = position.y + (height / 2);
|
||||
|
||||
for(int i = x_start; i <= x_stop; i++) {
|
||||
ansiConsole.printText(i, position.y - (height / 2), "#", color);
|
||||
ansiConsole.printText(i, position.y + (height / 2), "#", color);
|
||||
}
|
||||
for(int i = y_start; i< y_stop; i++) {
|
||||
ansiConsole.printText(position.x + (width / 2), i, "#", color);
|
||||
ansiConsole.printText(position.x - (width / 2), i, "#", color);
|
||||
}
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
#include "Shape.h"
|
||||
|
||||
#ifndef C_C_RECTANGLE_H
|
||||
#define C_C_RECTANGLE_H
|
||||
|
||||
|
||||
class Rectangle : public Shape{
|
||||
protected:
|
||||
int width;
|
||||
int height;
|
||||
|
||||
public:
|
||||
explicit Rectangle(int x = 0, int y = 0, int width = 0, int height = 0, Colors color = Colors::WHITE);
|
||||
void draw() override;
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_RECTANGLE_H
|
|
@ -1,19 +0,0 @@
|
|||
#include "Scene.h"
|
||||
#include <vector>
|
||||
|
||||
Scene::Scene(std::vector<Shape*> shapes) : shapes(std::move(shapes)) {
|
||||
|
||||
}
|
||||
|
||||
void Scene::draw() {
|
||||
ansiConsole.clearScreen();
|
||||
for(Shape* shape : shapes) {
|
||||
shape->draw();
|
||||
}
|
||||
}
|
||||
|
||||
Scene::~Scene() {
|
||||
for(Shape* shape : shapes) {
|
||||
delete shape;
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
#include <vector>
|
||||
#include "Shape.h"
|
||||
|
||||
#ifndef C_C_SCENE_H
|
||||
#define C_C_SCENE_H
|
||||
|
||||
class Scene {
|
||||
private:
|
||||
std::vector<Shape*> shapes;
|
||||
public:
|
||||
explicit Scene(std::vector<Shape*> shapes);
|
||||
void draw();
|
||||
~Scene();
|
||||
};
|
||||
|
||||
|
||||
#endif //C_C_SCENE_H
|
|
@ -1,9 +0,0 @@
|
|||
#include "Position.h"
|
||||
#include "Shape.h"
|
||||
|
||||
Shape::Shape(Position position, Colors color) {
|
||||
this->position = position;
|
||||
this->color = color;
|
||||
}
|
||||
|
||||
Shape::~Shape() = default;
|
|
@ -1,17 +0,0 @@
|
|||
#ifndef C_C_SHAPE_H
|
||||
#define C_C_SHAPE_H
|
||||
|
||||
#include "../../../helpers/AnsiConsole.h"
|
||||
#include "Position.h"
|
||||
|
||||
class Shape {
|
||||
protected:
|
||||
Position position;
|
||||
Colors color;
|
||||
public:
|
||||
Shape(Position position, Colors color);
|
||||
virtual ~Shape();
|
||||
virtual void draw() = 0;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,198 @@
|
|||
// file main_mp4_OO_b.cpp
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
//=======================================
|
||||
|
||||
struct FooVal {
|
||||
FooVal(int initialValue=0);
|
||||
~FooVal();
|
||||
private:
|
||||
int _someValue;
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class FooBase {
|
||||
FooVal _value;
|
||||
public:
|
||||
FooBase();
|
||||
FooBase(int initialValue);
|
||||
virtual ~FooBase();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class FooDerived : public FooBase {
|
||||
int _ival;
|
||||
public:
|
||||
FooDerived(int initialValue);
|
||||
~FooDerived();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
class Bar {
|
||||
FooBase *_helperObject;
|
||||
public:
|
||||
Bar();
|
||||
~Bar();
|
||||
};
|
||||
|
||||
//=======================================
|
||||
|
||||
FooVal::FooVal(int initialValue)
|
||||
: _someValue(initialValue)
|
||||
{
|
||||
std::cout << "FooVal::FooVal()" << std::endl;
|
||||
}
|
||||
|
||||
FooVal::~FooVal(){
|
||||
std::cout << "FooVal::~FooVal()" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::FooBase(){
|
||||
std::cout << "FooBase::FooBase()" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::FooBase(int initialValue)
|
||||
: _value(initialValue)
|
||||
{
|
||||
std::cout << "FooBase::FooBase(int)" << std::endl;
|
||||
}
|
||||
|
||||
FooBase::~FooBase(){
|
||||
std::cout << "FooBase::~FooBase(" << std::endl;
|
||||
}
|
||||
|
||||
FooDerived::FooDerived(int initialValue)
|
||||
: FooBase(initialValue), _ival(0)
|
||||
{
|
||||
std::cout << "FooDerived::FooDerived()" << std::endl;
|
||||
}
|
||||
|
||||
FooDerived::~FooDerived(){
|
||||
std::cout << "FooDerived::~FooDerived()" << std::endl;
|
||||
}
|
||||
|
||||
Bar::Bar(){
|
||||
_helperObject = new FooDerived(0);
|
||||
}
|
||||
|
||||
Bar::~Bar(){
|
||||
delete _helperObject;
|
||||
}
|
||||
|
||||
|
||||
struct StackObject {
|
||||
private:
|
||||
void* operator new(size_t size) noexcept {
|
||||
bool noStackObjectOnHeap = false;
|
||||
assert(noStackObjectOnHeap);
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct A : public StackObject {
|
||||
A(){std::cout << "+A ";}
|
||||
//A(const A&){std::cout << "+A";}
|
||||
~A(){std::cout << "-A ";}
|
||||
};
|
||||
|
||||
struct B : public StackObject {
|
||||
B(){std::cout << "+B ";}
|
||||
//B(const B&){std::cout << "+B";}
|
||||
~B(){std::cout << "-B ";}
|
||||
};
|
||||
|
||||
|
||||
struct C : public StackObject {
|
||||
C(){std::cout << "+C ";}
|
||||
//C(const C&){std::cout << "+C";}
|
||||
~C(){std::cout << "-C ";}
|
||||
};
|
||||
|
||||
class HeapObject{
|
||||
public:
|
||||
void* operator new (size_t size);
|
||||
HeapObject();
|
||||
virtual ~HeapObject();
|
||||
static bool assertionsHold();
|
||||
protected:
|
||||
private:
|
||||
static int ctorCount;
|
||||
static int dtorCount;
|
||||
static int newCount;
|
||||
// static void remove(HeapObject *);
|
||||
HeapObject(const HeapObject&) = delete;
|
||||
HeapObject& operator=(const HeapObject&) = delete;
|
||||
};
|
||||
|
||||
int HeapObject::ctorCount = 0;
|
||||
int HeapObject::dtorCount = 0;
|
||||
int HeapObject::newCount = 0;
|
||||
|
||||
void* HeapObject::operator new (size_t size){
|
||||
newCount++;
|
||||
return new char[size];
|
||||
}
|
||||
|
||||
HeapObject::HeapObject(){
|
||||
ctorCount++;
|
||||
}
|
||||
|
||||
HeapObject::~HeapObject(){
|
||||
dtorCount++;
|
||||
}
|
||||
|
||||
bool HeapObject::assertionsHold(){
|
||||
assert(ctorCount == newCount); // all objects have been allocated on heap
|
||||
assert(ctorCount == dtorCount); // all objects have been deleted
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
class K : public HeapObject
|
||||
{
|
||||
public:
|
||||
K(){std::cout << "+K ";}
|
||||
~K(){std::cout << "-K ";}
|
||||
};
|
||||
|
||||
class L {
|
||||
public:
|
||||
L(){std::cout << "+L ";}
|
||||
~L(){std::cout << "-L ";}
|
||||
};
|
||||
|
||||
|
||||
class M {
|
||||
public:
|
||||
M(){std::cout << "+M ";}
|
||||
~M(){std::cout << "-M ";}
|
||||
};
|
||||
|
||||
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
Bar * bar = new Bar();
|
||||
// ...
|
||||
delete bar; // implies "delete _helperObject";
|
||||
|
||||
FooBase *obj = new FooDerived(7);
|
||||
delete obj;
|
||||
|
||||
{
|
||||
C c;
|
||||
K* k = new K();
|
||||
delete k;
|
||||
}
|
||||
|
||||
HeapObject::assertionsHold();
|
||||
std::cout << " ENDE" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
#include <vector>
|
||||
#include "Shape.h"
|
||||
#include "Point.h"
|
||||
#include "Circle.h"
|
||||
#include "Rectangle.h"
|
||||
#include "Scene.h"
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
std::vector<Shape*> shapes;
|
||||
|
||||
shapes.push_back(new Point(30, 10, Colors::RED));
|
||||
shapes.push_back(new Point(28, 8, Colors::BLUE));
|
||||
shapes.push_back(new Point(32, 8, Colors::BLUE));
|
||||
|
||||
|
||||
shapes.push_back(new Circle(30, 10, 10, Colors::WHITE));
|
||||
shapes.push_back(new Circle(30, 20, 15, Colors::GREEN));
|
||||
|
||||
|
||||
shapes.push_back(new Rectangle(5, 21, 10, 10, Colors::MAGENTA));
|
||||
|
||||
shapes.push_back(new Point(5, 10, Colors::WHITE));
|
||||
shapes.push_back(new Point(15, 7, Colors::WHITE));
|
||||
shapes.push_back(new Point(7, 5, Colors::WHITE));
|
||||
|
||||
|
||||
auto *s = new Scene(shapes);
|
||||
s->draw();
|
||||
|
||||
delete s;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue