Dla treningu napisałem własny inteligentny wskaźnik, prosiłbym o feedback i odpowiedz na kilka pytań. Przykłady do pytań w komentarzach kodu.
- Jaka jest różnica między nazwami metod
unique_ptriunique_ptr<T>? - W STL nie da się przypisać referencji do wskaźnika, jak to zrobić w moim kodzie?
- W internecie widziałem, że ludzie przeciążając
operator bool()dają przed nim explicit, dlaczego?
Nie jestem w stanie sobie wyobrazić sytuacji, w której to coś daje. - Kilkukrotnie pisząc to miałem sytuacje, że kod się nie kompilował, po czym usuwałem jakąś metodę i przepisywałem ją w dokładnie taki sam sposób i program zaczynał działać. To jakiś błąd w MS VS, czy "programistyczny udar"?
- Napisałem wszystko w jednym pliku cpp, bo podzielenie na dwa wywalało błędy, jak to poprawnie napisać?
template<typename T>
class unique_ptr
{
private:
T* data;
public:
unique_ptr& operator=(const unique_ptr&) = delete;
unique_ptr(const unique_ptr&) = delete;
unique_ptr()
: data(nullptr) {};
explicit unique_ptr(T* data)
: data(data) {};
~unique_ptr()
{
delete data;
}
unique_ptr(unique_ptr&& ptr) noexcept // 1. unique_ptr<T>(unique_ptr<T>&& ptr)
: data(std::move(ptr.data))
{
ptr.data = nullptr;
}
unique_ptr& operator=(unique_ptr&& ptr) noexcept
{
if (this != &ptr)
{
data = std::move(ptr.data);
ptr.data = nullptr;
}
return *this;
}
void reset()
{
delete data;
data = nullptr;
}
T* release()
{
T* result = data;
data = nullptr;
return result;
}
T* get()
{
return data;
}
T& operator*() const
{
return *data;
}
T* operator->() const
{
return data;
}
const T* operator&() const // 2. const int* p = &ptr, to nie powinno się kompilować
{ // std::cout << &ptr, a to powinno
return data;
}
operator bool() // 3. explicit?
{
return data;
}
};