C++ 动态投影向量元素

C++ 动态投影向量元素,c++,iterator,dynamic-cast,C++,Iterator,Dynamic Cast,我试图创建一个包含基类元素的新类型向量。我所做的是将基类向量元素动态转换到派生类型,以便应用我在派生类中添加的一些方法 这是我大概做的: std::vector<BaseClass *> A; std::vector<DerivedClass *> B; DerivedClass *m = new DerivedClass; std::vector<BaseClass *>::const_iterator iterator = A.begin(); AMD_S

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

这是我大概做的:

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();
std::向量A;
std::载体B;
DerivedClass*m=新的DerivedClass;
std::vector::const_iterator iterator=A.begin();
AMD_STD::vector::const_iterator iteratorEnd=A.end()
for(;迭代器!=iteratorEnd;++iterator)
{
m=动态_转换(*迭代器);
B.推回(m);
}
B->MyMethod();
问题是,当我尝试应用该方法时,我有一个空指针,它会生成执行错误。 我认为这个问题是由于一个动态演播失败造成的。有人能帮我解决这个问题吗。 提前谢谢

如果
dynamic\u cast(*iterator)
失败并在
*iterator
不是
nullptr
时返回
nullptr
,那么您已经向向量添加了一个元素,该元素的类型为
BaseClass*
,但不是
派生类*
。就这么简单

你还没有展示任何添加向量元素的代码,你明确地说“这就是我所做的”,这为其他事实留下了余地。

如果
dynamic\u cast(*iterator)
失败,当
*iterator
不是
nullptr
时返回
nullptr
,然后向向量添加了一个元素,该元素的类型为
BaseClass*
,但不是
DerivedClass*
类型。就这么简单


你没有展示任何添加向量元素的代码,你明确地说“这就是我所做的”,这为其他真理留下了余地。

显然,当
B
是一个
向量时,
B->MyMethod()
不会编译,但假设您稍后尝试迭代
B
,并在其中的每个指针上调用
MyMethod
,您的问题将是推入
向量
B
nullptr
。为避免将它们放入其中,请仅在它们不为null时推送:

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

if(m=dynamic_cast(*迭代器))
B.推回(m);

另外,我建议将变量生存期定位到尽可能小的使用范围,并使用C++11表示法:

for (auto& base_ptr : B)
     if (DerivedClass* p = dynamic_cast<DerivedClass *>(base_ptr))
         B.push_back(p);
for(自动和基本)
if(DerivedClass*p=动态演员阵容(基本演员阵容))
B.推回(p);

显然,当
B
向量时,
B->MyMethod()
不会编译,但假设您稍后尝试迭代
B
,并在其中的每个指针上调用
MyMethod
,您的问题将是推入
向量
B
nullptr
。为避免将它们放入其中,请仅在它们不为null时推送:

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

if(m=dynamic_cast(*迭代器))
B.推回(m);

另外,我建议将变量生存期定位到尽可能小的使用范围,并使用C++11表示法:

for (auto& base_ptr : B)
     if (DerivedClass* p = dynamic_cast<DerivedClass *>(base_ptr))
         B.push_back(p);
for(自动和基本)
if(DerivedClass*p=动态演员阵容(基本演员阵容))
B.推回(p);

请发布一个实际再现问题的最小代码,以便我们可以看到它。很难从您发布的代码片段中分辨出来-从概念上讲,它没有问题(一般来说,它不会编译)。您能发布一个我们可以运行并显示您的问题的代码片段吗
B->MyMethod()
不会编译,而且您永远不会填充
A
。嗯,
dynamic\u cast
是一种代码气味。您可能应该重新考虑您的设计。这是完整的代码吗?似乎不正确。A没有任何元素。另外,为m(
DerivedClass*m=new-DerivedClass;
)所做的内存分配似乎没有用。请发布一个实际再现问题的最小代码,以便我们可以看到它。很难从您发布的代码片段中分辨出来-从概念上讲,它没有问题(一般来说,它不会编译)。您能发布一个我们可以运行并显示您的问题的代码片段吗
B->MyMethod()
不会编译,而且您永远不会填充
A
。嗯,
dynamic\u cast
是一种代码气味。您可能应该重新考虑您的设计。这是完整的代码吗?似乎不正确。A没有任何元素。另外,为m(
DerivedClass*m=new-DerivedClass;
)所做的内存分配似乎没有用。“简洁就是智慧”不是一个通用常量。为了维护者的利益,更加明确更好<代码>如果((m=dynamic_cast(*iterator))!=nullptr)
。另外,我相信一些编译器会对条件中的括号赋值给出警告。我认为Tony的代码是惯用的,几乎所有使用过<代码>动态DistaCase<代码>的人都会看到它在做什么。@ MIDION:我不同意,与 NulLPTR < /C>相比,指针和整数的隐式转换为<代码>真< /代码> />代码> false <代码>值是直观的,值得早期学习C++程序员。对于某些编译器发出警告,这是正确的。。。还有一个该死的痛苦,因为如果添加额外的括号,C++就不会让你创建<代码> < < /代码> -作用域变量(如我在第二个代码片段中所做的那样)。我建议禁用该特定警告(可能偶尔启用,并将无问题的案例放大)。我不会争论无任务测试中隐含的真/假,但是当测试包含作业时,最好是明确而不是冒险。@Medinoc:对于本地化形式
if(DerivedClass*p=dynamic\u cast(base\u ptr))来说,这甚至是不可能的
-将比较添加到
nullptr
只能在赋值之前生成一个
bool
,这会阻止指针的正确赋值。我不认为显式降低风险——<代码>(A= B)之间的差异!空PTR
(a=b)