嘿,在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()方法,并且演员也无法正常工作。任何决议?或者是不可能的?
答案 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()从自身中删除对象(这通常是一个坏主意),或者你保留重复的指针并将其删除到别处,这是另一个冒险的想法。