diff options
sem 11
2 files changed, 93 insertions, 0 deletions
| -rw-r--r-- | Sem. 10/Examples/Optional/Optional.hpp | 74 | ||||
| -rw-r--r-- | Sem. 10/Examples/Optional/Source2.cpp | 19 |
diff --git a/Sem. 10/Examples/Optional/Optional.hpp b/Sem. 10/Examples/Optional/Optional.hpp new file mode 100644 index 0000000..9e3ab0f --- /dev/null +++ b/Sem. 10/Examples/Optional/Optional.hpp @@ -0,0 +1,74 @@ +#pragma once +#include <iostream> +#include <exception> +template <typename T> +class Optional +{ + T* data; //DYN MEM + + void copyFrom(const Optional<T>& other); + void free(); +public: + Optional(); + Optional(const T& obj); + + bool containsData() const; + const T& getData() const; + void setData(const T& el); + void clear(); + + +}; + +template <typename T> +Optional<T>::Optional() : data(nullptr) +{} + +template <typename T> +Optional<T>::Optional(const T& obj) : data(nullptr) +{ + setData(obj); +} + +template <typename T> +bool Optional<T>::containsData() const +{ + return data != nullptr; +} + +template <typename T> +const T& Optional<T>::getData() const +{ + if (!containsData()) + throw std::logic_error("No data in optional"); + return *data; +} + +template <typename T> +void Optional<T>::setData(const T& el) +{ + delete data; + data = new T(el);// copy const; +} + +template <typename T> +void Optional<T>::copyFrom(const Optional<T>& other) +{ + if (other.containsData()) + data = new T(*other.data); + else + data = nullptr; +} + +template <typename T> +void Optional<T>::free() +{ + delete data; +} + +template <typename T> +void Optional<T>::clear() +{ + free(); + data = nullptr; +} diff --git a/Sem. 10/Examples/Optional/Source2.cpp b/Sem. 10/Examples/Optional/Source2.cpp new file mode 100644 index 0000000..7c3e21b --- /dev/null +++ b/Sem. 10/Examples/Optional/Source2.cpp @@ -0,0 +1,19 @@ +#include <iostream> +#include "Optional.hpp" + + + +int main() +{ + Optional<int> d; //no value + + d.setData(3); + + d.getData(); + + d.clear(); + + + std::cout << d.containsData(); + +} |
