Dynamic_Cast 向量元素
Dynamic_Cast vector elements
我正在尝试创建一个包含基数 class 元素的新型向量。我所做的是将基础 class 向量元素的 dynamic_cast 转换为派生类型,以便应用我在派生 class 中添加的一些方法。
这是我大致做的:
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 失败造成的。谁能帮我解决这个问题。
提前致谢。
如果 dynamic_cast<DerivedClass*>(*iterator)
失败并且 returns nullptr
当 *iterator
不是 nullptr
时,那么您已经向向量中添加了一个元素 是类型BaseClass*
,但不是类型DerivedClass*
。就这么简单。
虽然您没有展示任何添加矢量元素的代码,但您明确表示 "This is what I approximately did",这为其他真理留下了空间。
显然,当 B
是 vector
时,B->MyMethod();
将无法编译,但假设您稍后尝试遍历 B
并调用 MyMethod
在其中的每个指针上,您的问题将是您推入 vector
B
的 nullptr
s。为避免将它们放在那里,仅在它们不为空时才推送:
for( ; iterator!= iteratorEnd; ++iterator)
if (m = dynamic_cast<DerivedClass *>(*iterator))
B.push_back(m);
另外,我建议将变量生命周期本地化到尽可能小的使用范围并使用 C++11 表示法:
for (auto& base_ptr : B)
if (DerivedClass* p = dynamic_cast<DerivedClass *>(base_ptr))
B.push_back(p);
我正在尝试创建一个包含基数 class 元素的新型向量。我所做的是将基础 class 向量元素的 dynamic_cast 转换为派生类型,以便应用我在派生 class 中添加的一些方法。
这是我大致做的:
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 失败造成的。谁能帮我解决这个问题。 提前致谢。
如果 dynamic_cast<DerivedClass*>(*iterator)
失败并且 returns nullptr
当 *iterator
不是 nullptr
时,那么您已经向向量中添加了一个元素 是类型BaseClass*
,但不是类型DerivedClass*
。就这么简单。
虽然您没有展示任何添加矢量元素的代码,但您明确表示 "This is what I approximately did",这为其他真理留下了空间。
显然,当 B
是 vector
时,B->MyMethod();
将无法编译,但假设您稍后尝试遍历 B
并调用 MyMethod
在其中的每个指针上,您的问题将是您推入 vector
B
的 nullptr
s。为避免将它们放在那里,仅在它们不为空时才推送:
for( ; iterator!= iteratorEnd; ++iterator)
if (m = dynamic_cast<DerivedClass *>(*iterator))
B.push_back(m);
另外,我建议将变量生命周期本地化到尽可能小的使用范围并使用 C++11 表示法:
for (auto& base_ptr : B)
if (DerivedClass* p = dynamic_cast<DerivedClass *>(base_ptr))
B.push_back(p);