diff options
10 files changed, 172 insertions, 0 deletions
| -rw-r--r-- | Sem. 13/Farm/Animal.h | 11 | ||||
| -rw-r--r-- | Sem. 13/Farm/Cat.cpp | 12 | ||||
| -rw-r--r-- | Sem. 13/Farm/Cat.h | 8 | ||||
| -rw-r--r-- | Sem. 13/Farm/Dog.cpp | 12 | ||||
| -rw-r--r-- | Sem. 13/Farm/Dog.h | 8 | ||||
| -rw-r--r-- | Sem. 13/Farm/Farm.cpp | 63 | ||||
| -rw-r--r-- | Sem. 13/Farm/Farm.h | 24 | ||||
| -rw-r--r-- | Sem. 13/Farm/Mouse.cpp | 12 | ||||
| -rw-r--r-- | Sem. 13/Farm/Mouse.h | 8 | ||||
| -rw-r--r-- | Sem. 13/Farm/source.cpp | 14 |
diff --git a/Sem. 13/Farm/Animal.h b/Sem. 13/Farm/Animal.h new file mode 100644 index 0000000..3911d49 --- /dev/null +++ b/Sem. 13/Farm/Animal.h @@ -0,0 +1,11 @@ +#pragma once
+#include <iostream>
+class Animal
+{
+public:
+ virtual void sayHello() const = 0;
+
+ virtual Animal* clone() const = 0;//създава копие на текущия обект.
+
+ virtual ~Animal() {} //!!!
+};
\ No newline at end of file diff --git a/Sem. 13/Farm/Cat.cpp b/Sem. 13/Farm/Cat.cpp new file mode 100644 index 0000000..4bb833a --- /dev/null +++ b/Sem. 13/Farm/Cat.cpp @@ -0,0 +1,12 @@ +#include "Cat.h"
+
+void Cat::sayHello() const
+{
+ std::cout << "Hello, I am a Cat!" << std::endl;
+}
+
+Animal* Cat::clone() const
+{
+ Animal* newObj = new Cat(*this); //copy constr of Mouse
+ return newObj;
+}
\ No newline at end of file diff --git a/Sem. 13/Farm/Cat.h b/Sem. 13/Farm/Cat.h new file mode 100644 index 0000000..1e1525d --- /dev/null +++ b/Sem. 13/Farm/Cat.h @@ -0,0 +1,8 @@ +#pragma once
+#include "Animal.h"
+class Cat : public Animal
+{
+public:
+ void sayHello() const override;
+ Animal* clone() const override;
+};
\ No newline at end of file diff --git a/Sem. 13/Farm/Dog.cpp b/Sem. 13/Farm/Dog.cpp new file mode 100644 index 0000000..f44692c --- /dev/null +++ b/Sem. 13/Farm/Dog.cpp @@ -0,0 +1,12 @@ +#include "Dog.h"
+
+void Dog::sayHello() const
+{
+ std::cout << "Hello, I am a Dog!" << std::endl;
+}
+
+Animal* Dog::clone() const
+{
+ Animal* newObj = new Dog(*this); //copy constr of Mouse
+ return newObj;
+}
\ No newline at end of file diff --git a/Sem. 13/Farm/Dog.h b/Sem. 13/Farm/Dog.h new file mode 100644 index 0000000..26fc187 --- /dev/null +++ b/Sem. 13/Farm/Dog.h @@ -0,0 +1,8 @@ +#pragma once
+#include "Animal.h"
+class Dog : public Animal
+{
+public:
+ void sayHello() const override;
+ Animal* clone() const override;
+};
\ No newline at end of file diff --git a/Sem. 13/Farm/Farm.cpp b/Sem. 13/Farm/Farm.cpp new file mode 100644 index 0000000..1328e95 --- /dev/null +++ b/Sem. 13/Farm/Farm.cpp @@ -0,0 +1,63 @@ +#include "Farm.h"
+
+void Farm::free()
+{
+ for (size_t i = 0; i < animalsCount; i++)
+ delete animals[i]; //не се инт. какъв обект е. (вирт дестр)
+ delete[] animals;
+}
+void Farm::copyFrom(const Farm& other)
+{
+ animals = new Animal * [other.animalsCount];
+ animalsCount = other.animalsCount;
+ capacity = other.capacity;
+
+ for (size_t i = 0; i < animalsCount; i++)
+ {
+ animals[i] = other.animals[i]->clone();
+ }
+}
+void Farm::resize()
+{
+ Animal** newCollection = new Animal * [capacity *= 2];
+ for (size_t i = 0; i < animalsCount; i++)
+ newCollection[i] = animals[i]; // !!не правим клониране
+ delete[] animals;
+ animals = newCollection;
+}
+void Farm::addAnimal(const Animal& currentAnimal)
+{
+ if (animalsCount == capacity)
+ resize();
+ animals[animalsCount++] = currentAnimal.clone();
+}
+
+Farm::Farm()
+{
+ capacity = 8;
+ animalsCount = 0;
+ animals = new Animal * [capacity];
+}
+Farm::Farm(const Farm& other)
+{
+ copyFrom(other);
+}
+Farm& Farm::operator=(const Farm& other)
+{
+ if (this != &other)
+ {
+ free();
+ copyFrom(other);
+ }
+ return *this;
+}
+Farm::~Farm()
+{
+ free();
+}
+
+void Farm::allSayHello() const
+{
+ for (size_t i = 0; i < animalsCount; i++)
+ animals[i]->sayHello();
+}
diff --git a/Sem. 13/Farm/Farm.h b/Sem. 13/Farm/Farm.h new file mode 100644 index 0000000..f33f244 --- /dev/null +++ b/Sem. 13/Farm/Farm.h @@ -0,0 +1,24 @@ +#pragma once
+#include "Animal.h"
+
+class Farm
+{
+ Animal** animals;
+ size_t animalsCount;
+ size_t capacity;
+
+ void free();
+ void copyFrom(const Farm& other);
+ void resize();
+
+public:
+ Farm();
+ Farm(const Farm& other);
+ Farm& operator=(const Farm& other);
+ ~Farm();
+
+ void addAnimal(const Animal& animal);
+
+ void allSayHello() const;
+
+};
diff --git a/Sem. 13/Farm/Mouse.cpp b/Sem. 13/Farm/Mouse.cpp new file mode 100644 index 0000000..a6dc30a --- /dev/null +++ b/Sem. 13/Farm/Mouse.cpp @@ -0,0 +1,12 @@ +#include "Mouse.h"
+
+void Mouse::sayHello() const
+{
+ std::cout << "Hello, I am a Mouse!" << std::endl;
+}
+
+Animal* Mouse::clone() const
+{
+ Animal* newObj = new Mouse(*this); //copy constr of Mouse
+ return newObj;
+}
\ No newline at end of file diff --git a/Sem. 13/Farm/Mouse.h b/Sem. 13/Farm/Mouse.h new file mode 100644 index 0000000..3af9fbc --- /dev/null +++ b/Sem. 13/Farm/Mouse.h @@ -0,0 +1,8 @@ +#pragma once
+#include "Animal.h"
+class Mouse : public Animal
+{
+public:
+ void sayHello() const override;
+ Animal* clone() const override;
+};
\ No newline at end of file diff --git a/Sem. 13/Farm/source.cpp b/Sem. 13/Farm/source.cpp new file mode 100644 index 0000000..e5b5cf7 --- /dev/null +++ b/Sem. 13/Farm/source.cpp @@ -0,0 +1,14 @@ +#include <iostream>
+#include "Farm.h"
+#include "Dog.h"
+#include "Cat.h"
+#include "Mouse.h"
+
+int main()
+{
+ Farm f;
+ f.addAnimal(Dog());
+ f.addAnimal(Cat());
+
+ f.allSayHello();
+}
\ No newline at end of file |
