0

我已经实现了一个指向对象的指针向量。当我在模板中指定的数据类型不是指针时,它的行为就像一个向量。我想用它来支持一些多态对象,所以我在模板中指定的数据类型必须是指针。我陷入了一个必须处理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) ; 
}
4

1 回答 1

1

如果您的代码存储了指向对象的指针,则删除对象本身不是您的任务(在容器中)。存储指向对象的全部意义在于您不想存储对象本身,而是存储指向对象的指针。如果你有一个vector<MyClass *> v;- 你不希望MyClass*向量中的那个被销毁[或者至少,如果你确实想要它,你会感到失望],这完全是一样的。

现在,如果您Vector希望这种情况发生的用户,他应该在容器中存储一个unique_ptrshared_ptr,而不是一个基本指针。

于 2013-08-01T00:08:25.503 回答