我正在玩我的智能指针类,我想用以下行为实现++和 - 运算符:如果指针指向单个变量或指向数组而++( - )将指针移出数组尝试使用++( - )时,应该抛出一个异常。
类似的东西:
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
那么在++( - )之后有没有办法确定指针指向“我的”对象类型?
答案 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)
停止使用原始指针/原始数组并开始使用向量。然后你可以得到向量的大小,只需将元素的位置存储在智能指针类中。