Задача поставлена следующим образом: создать класс умный указатель, с которым можно будет реализовать следующее:
int main()
{
SmartPointer
если создаем объект Object = new Object(3); - тогда мы можем обратиться с помощью стрелки ко всем методам которыми обладает объект Object
если мы создали массив объект Object = new Object[3] - тогда мы не можем обратиться с помощью стрелки к массиву.
Код ниже:
template
Counter *m_count = nullptr;
T *m_ptr = nullptr;
typedef std::remove_all_extents_t
public:
SmartPointer(T* const ptr) :
m_count(new Counter),
m_ptr(ptr)
{
m_count->incrementCount();
}
SmartPointer(const SmartPointer &source)
m_count(source.m_count),
m_ptr(source.m_ptr)
{
m_count->incrementCount();
}
SmartPointer& operator=(const SmartPointer &right)
{
m_count->decrementCount();
return SmartPointer(right).Swap(*this);
}
T& operator*()
{
return *m_ptr;
}
T* operator->()
{
return m_ptr;
}
T& operator[](unsigned int index)
{
return m_ptr[index];
}
SmartPointer& Swap(SmartPointer& other)
{
std::swap(m_ptr, other.m_ptr);
return *this;
}
~SmartPointer()
{
{
m_count->decrementCount();
if (m_count->getCount() == 0)
{
m_deleter.Delete(m_ptr);
delete m_count;
}
}
}
};
template
template
class Counter
{
private:
unsigned int m_uses=0;
public:
void incrementCount()
{
++m_uses;
}
void decrementCount()
{
--m_uses;
}
unsigned int getCount()
{
return m_uses;
}
};
Не совсем понятно как сделать так что бы компилятор понимал где (), а где []
где один элемент, а где массив элементов + как исправить ошибку в этой строке кода:
SmartPointer
Ответ
Вам нужно просто сделать два разных класса: один для массива, другой - для скаляра. Так же это сделано для std::unique_ptr. Пример:
template
template
struct A {
void foo() {}
};
int main()
{
smartPtr ip;
ip->foo();
ip[0]; // error
smartPtr ia;
ia->foo(); // error
ia[0].foo();
}
Комментариев нет:
Отправить комментарий