gpt4 book ai didi

c++ - 在指针的多态数组中删除和对象

转载 作者:行者123 更新时间:2023-11-28 07:29:39 24 4
gpt4 key购买 nike

我已经实现了一个指向对象的指针 vector 。当我在模板中指定的数据类型不是指针时,它的行为就像一个 vector 一样。我想用它来支持一些多态对象,所以我在模板中指定的数据类型必须是一个指针。我被困在一个必须删除 vector 中的元素的方法中,我不知道如何解决这个问题。
我将尝试用这个代表我所做的示例来说明我的观点:

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 的析构函数。我应该怎么做才能解决这个问题?


这是我使用 vector 的方式:

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) ;
}

最佳答案

如果您的代码存储指向对象的指针,那么删除对象本身不是您的任务(在容器中)。存储指向对象的全部要点是您不想存储对象本身,而是存储指向对象的指针。如果你有一个 vector<MyClass *> v; 就完全一样了- 你不想要 MyClass*那在要被破坏的 vector 中[或者至少,如果你确实想要它,你会失望的]。

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

关于c++ - 在指针的多态数组中删除和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com