如何确定对象指针的类型?

时间:2012-01-29 14:29:02

标签: c++ pointers smart-pointers

我正在玩我的智能指针类,我想用以下行为实现++和 - 运算符:如果指针指向单个变量或指向数组而++( - )将指针移出数组尝试使用++( - )时,应该抛出一个异常。

类似的东西:

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类型。

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 个答案:

答案 0 :(得分:3)

new A[3]会返回A*,就像new A一样。所以你无法区分它们。

如果您希望您的类进行边界检查,那么您需要明确告诉它数组中有多少项。

答案 1 :(得分:1)

不,如果你想实现这种行为,你必须存储分配数组大小的某个地方。

答案 2 :(得分:1)

如果您使用实用程序函数而不是直接使用数组new,则只能执行此类边界检查,例如:

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

如果智能指针删除了对象,请记住在数组的情况下使用delete[]

答案 3 :(得分:1)

停止使用原始指针/原始数组并开始使用向量。然后你可以得到向量的大小,只需将元素的位置存储在智能指针类中。