Dynamic_Cast向量元素

时间:2015-08-20 09:02:51

标签: c++ iterator dynamic-cast

我试图创建一个包含基类元素的新类型向量。我所做的是对派生类型的基类向量元素的dynamic_cast,以便应用我在派生类中添加的一些方法。

这就是我大概做的:

std::vector<BaseClass *> A;
std::vector<DerivedClass *> B;
DerivedClass *m = new DerivedClass;
std::vector<BaseClass *>::const_iterator iterator = A.begin();
AMD_STD::vector<BaseClass *>::const_iterator iteratorEnd = A.end()

for(; iterator!= iteratorEnd; ++iterator)
{
 m = dynamic_cast<DerivedClass *>(*iterator); 
 B.push_back(m);
}
 B->MyMethod();

问题是当我尝试应用该方法并且它产生执行错误时,我有一个NULL指针。 我认为问题是由于dynamic_cast失败。任何人都可以帮我解决这个问题。 提前致谢。

2 个答案:

答案 0 :(得分:2)

如果dynamic_cast<DerivedClass*>(*iterator)失败并在nullptr不是*iterator时返回nullptr,那么您已向 的向量添加了一个元素类型BaseClass*,但不是<{1}}类型的。就这么简单。

你没有展示任何你添加矢量元素的代码,你明确地说“这就是我所做的”,这使得竞技场对其他真理开放。

答案 1 :(得分:2)

显然当Bvector时,B->MyMethod();不会编译,但假设您以后尝试迭代B并调用{ {1}}在其中的每个指针上,您的问题将是MyMethod已被推入nullptr vector。为避免将它们放在那里,只有当它们不为空时才推动:

B

另外,我建议将变量生命周期本地化到尽可能小的使用范围并使用C ++ 11表示法:

for( ; iterator!= iteratorEnd; ++iterator)
     if (m = dynamic_cast<DerivedClass *>(*iterator))
         B.push_back(m);