矢量迭代器铸造

时间:2009-09-03 09:03:07

标签: c++ vector pointers casting

嘿,在C ++中,我有一个类型的向量:

vector<BaseClass*> myVector;

其中,我将派生类的指针(push_back)插入其中。

现在,我想回弹它的元素,所以我这样做:

vector<ADlgcDev*>::iterator iter;

for (iter = myVector.rbegin(); iter != myVector.rend(); iter++)
{
 // but before I pop it, I need to shutdown it down
 // so I cast this
 // but this way, I'm unable to call the function
 (DerivedClass*(*iter))->Shutdown();

 myVector.pop_back();
}

但正如我在弹出之前的评论中所提到的,我需要调用其 Shutdown()方法,并且演员也无法正常工作。任何决议?或者是不可能的?

4 个答案:

答案 0 :(得分:13)

while (!myVector.empty())
{
  ((DerivedClass*)(myVector.back()))->Shutdown();
  myVector.pop_back();
}

注意:

  • 您应该使用dynamic_cast而不是强硬演员。 (如果确定向量中只有DerivedClass个对象,为什么它不是std::vector<DerivedClass>?)
  • 您可能根本不需要进行投射,因为Shutdown()应该在基类中声明。
  • 在将它们从向量中弹出之前,您应该删除这些对象。 (但可能不是这样。)
  • 您应该使用一个智能指针,可能会调用Shutdown()(和delete)。

修改:使用std::vector<T>::clear()as shown by markh44可能比pop_back()更好。

答案 1 :(得分:2)

你能在BaseClass中关闭一个虚拟函数吗?那你就不需要演员。

此外,您在迭代时可能无法从矢量中删除项目。我会这样做:

vector<BaseClass*>::iterator iter;

for (iter = myVector.rbegin(); iter != myVector.rend(); iter++)
{
    (*iter)->Shutdown();
}
myVector.clear();

编辑:另外一件事,++ iter通常比iter ++更受欢迎。

答案 2 :(得分:1)

构造函数转换对指针不起作用。如果您确定或使用dynamic_cast,请使用static_cast并检查。

答案 3 :(得分:-1)

如果Shutdown()是Base类的虚方法,即BaseClass :: ShutDown(),则应直接调用iter-&gt; ShutDown();

否则,如果该方法不是虚拟的,则应使用dynamic_cast

vector<ADlgcDev*>::iterator iter;

for (iter = myVector.rbegin(); iter != myVector.end(); iter++)
{
 DerivedClassA* a = dynamic_cast<DerivedClassA*>( *iter ) ;
 if ( a ) a->ShutDownA();
 else
 {
 DerivedClassB* b = dynamic_cast<DerivedClassB*>(*iter);
 if ( b ) b->ShutDownB();
 // ... repeat for every class in hierarchy that might be in the vector.
 }
 myVector.pop_back();
}

无论如何,你可能会泄漏内存,除非ShutDown()从自身中删除对象(这通常是一个坏主意),或者你保留重复的指针并将其删除到别处,这是另一个冒险的想法。