Как определить тип указателя объекта? - PullRequest
1 голос
/ 29 января 2012

Я играю со своим классом интеллектуальных указателей и хочу реализовать операторы ++ и - со следующим поведением: если указатель указывает на одну переменную или если он указывает на массив, а ++ (-) перемещает указатель из массива Bounds исключение должно быть выдано при попытке ++ (-).

Примерно так:

class A;

SmartPtr<A> s(new A[3]);
SmartPtr<A> s1(new A());
++s;//ok
--s;//ok
--s;//exception OutOfBounds thrown
++s1;//exception OutOfBounds thrown
--s1;//exception OutOfBounds thrown

Я пытался использовать typeid. Но он все равно возвращает тип.

A* arr=new A[3];
typeid(arr).name();//type is P1A
typeid(--arr).name();//type is P1A
typeid(arr+7).name();//type is P1A

Так есть ли способ определить, указывает ли указатель на объект типа "мой" после ++ (-)?

Ответы [ 4 ]

3 голосов
/ 29 января 2012

new A[3] возвращает A*, как и new A. Так что вы не можете их различить.

Если вы хотите, чтобы ваш класс выполнял проверку границ, вам нужно явно указать ему, сколько элементов в массиве.

1 голос
/ 29 января 2012

прекратите использовать необработанные указатели / необработанные массивы и начните использовать вектор. Затем вы можете получить размер вектора и просто сохранить положение элемента в вашем классе интеллектуальных указателей.

1 голос
/ 29 января 2012

Вы можете выполнять такую ​​проверку границ, только если вы используете служебную функцию, а не массив new напрямую, например ::

.
template <class Type, std::size_t size>
SmartPtr<Type> MakeArrayPtr()
{
  return SmartPtr<Type>(new Type[size], size);
}

Если умный указатель удаляет объект, не забывайте использовать для него delete[] в случае массивов.

1 голос
/ 29 января 2012

Нет, если вы хотите реализовать такое поведение, вы должны где-то хранить размер выделенного массива.

...