#pragma once #include #include template class Optional { T* data; //DYN MEM void copyFrom(const Optional& other); void free(); public: Optional(); Optional(const T& obj); Optional(const Optional& other); Optional& operator=(const Optional& other); bool containsData() const; const T& getData() const; void setData(const T& el); void clear(); }; template Optional::Optional() : data(nullptr) {} template Optional::Optional(const T& obj) : data(nullptr) { setData(obj); } template bool Optional::containsData() const { return data != nullptr; } template const T& Optional::getData() const { if (!containsData()) throw std::logic_error("No data in optional"); return *data; } template void Optional::setData(const T& el) { delete data; data = new T(el);// copy const; } template void Optional::copyFrom(const Optional& other) { if (other.containsData()) data = new T(*other.data); else data = nullptr; } template void Optional::free() { delete data; } template void Optional::clear() { free(); data = nullptr; } template Optional::Optional(const Optional& other) { copyFrom(other); } template Optional& Optional::operator=(const Optional& other) { if (this != &other) { free(); copyFrom(other); } return *this; }