我已经实现了一个指向对象的指针向量。当我在模板中指定的数据类型不是指针时,它作为向量正常运行。我想使用它来支持一些多态对象,因此我在模板中指定的数据类型必须是指针。我陷入了一个必须delete
向量中的元素的方法,我不知道如何解决这个问题。
我将尝试使用代表我所做的示例来表达我的观点:
template<typename _Tp>
class Vector{
private:
_Tp ** container ;
size_t size ;
size_t capacity ;
/*...*/
public:
Vector() : container (NULL) { /*...*/ }
Vector( int capacity ) {
container = new _Tp* [capacity] () ;
for ( int i = 0 ; i < capacity ; i++ )
container[i] = NULL ;
size = 0 ;
this->capacity = capacity ;
}
void deleteAt ( int position ) {
/*... Check bad position ...*/
delete ( container[position] ) ;
/*... move data ... */
}
void assignAt ( int position, const _Tp & obj ) {
/*... Check bad position and capacity ...*/
container[position] = new _Tp ( obj ) ;
size++ ;
}
/*... more methods ...*/
} ;
deleteAt(int)
被调用,_Tp = SomeClass*
SomeClass的析构函数永远不会被调用。我该怎么做才能解决这个问题?
这是我使用矢量的方式:
class Base () {/*... Astract class ...*/ } ;
class Derived1 () : public Base {/*... Implementation ...*/} ;
/*... More derived classes from Base ...*/
int main (void) {
Vector<Base*> * v = new Vector<Base*> (100) ;
v->assignAt(50,new Derived1 ()) ;
v->deleteAt(50) ;
}
答案 0 :(得分:1)
如果您的代码存储指向对象的指针,则删除对象本身不是您(在容器中)的任务。存储指向对象的关键在于您不希望存储对象本身,而是存储指向对象的指针。如果你有一个vector<MyClass *> v;
就完全一样了 - 你不希望向量中的MyClass*
被破坏[或者至少,如果你想要它,你会感到失望]。
现在,如果Vector
的用户希望发生这种情况,他应该在容器中存储unique_ptr
或shared_ptr
,而不是基本指针。