C++ C++;对于每个隐藏类型强制转换

C++ C++;对于每个隐藏类型强制转换,c++,foreach,type-conversion,C++,Foreach,Type Conversion,我有一个for-each循环,它在指针向量上迭代。指针指向一个基类。在for each循环中,我使用派生类型作为迭代器的类型。render函数仅在某些派生类中定义,但代码编译并运行。。。如果向量包含指向不具有渲染功能的派生对象的指针(显然),则会崩溃 这个错误发生在我的代码中,因为当我编写它时,向量只包含指向派生类的指针,但后来我决定重构代码,这就改变了 谁能告诉我捕捉这个错误的正确方法吗?检查空指针似乎不起作用。如果我理解正确,问题是向量中只有一些指针指向实现render()类型的对象。如果是

我有一个for-each循环,它在指针向量上迭代。指针指向一个基类。在for each循环中,我使用派生类型作为迭代器的类型。render函数仅在某些派生类中定义,但代码编译并运行。。。如果向量包含指向不具有渲染功能的派生对象的指针(显然),则会崩溃

这个错误发生在我的代码中,因为当我编写它时,向量只包含指向派生类的指针,但后来我决定重构代码,这就改变了


谁能告诉我捕捉这个错误的正确方法吗?检查空指针似乎不起作用。

如果我理解正确,问题是向量中只有一些指针指向实现
render()
类型的对象。如果是这种情况,
dynamic\u cast
将执行检查正确类型的技巧

for (DerivedClass *p : myVector) {
  class_implementing_render *q = dynamic_cast<class_implementing_render>(p);
  if (q) q->render();
}
for(DerivedClass*p:myVector){
class_实现_render*q=动态_cast(p);
如果(q)q->render();
}

如果我理解正确,问题是向量中只有一些指针指向实现
render()
类型的对象。如果是这种情况,
dynamic\u cast
将执行检查正确类型的技巧

for (DerivedClass *p : myVector) {
  class_implementing_render *q = dynamic_cast<class_implementing_render>(p);
  if (q) q->render();
}
for(DerivedClass*p:myVector){
class_实现_render*q=动态_cast(p);
如果(q)q->render();
}

实际上,这里的问题是微软的foreach循环过于宽松。Microsoft已弃用此扩展,转而支持基于范围的标准for循环(从C++11开始):

在这里,循环的头不会编译,因为它无法从
BaseClass*
初始化
DerivedClass*

关于如何将其编译,首先,请重新考虑您的设计。您应该针对接口而不是实现进行编程。当某些对象不可渲染时,必须依赖于这些对象是可渲染的,这是一种代码气味。也就是说,可以通过
动态\u cast

for (auto base : myVector) {
    if (auto derived = dynamic_cast<DerivedClass*>(base)) {
        derived->render();
    }
}

实际上,这里的问题是微软的foreach循环过于宽松。Microsoft已弃用此扩展,转而支持基于范围的标准for循环(从C++11开始):

在这里,循环的头不会编译,因为它无法从
BaseClass*
初始化
DerivedClass*

关于如何将其编译,首先,请重新考虑您的设计。您应该针对接口而不是实现进行编程。当某些对象不可渲染时,必须依赖于这些对象是可渲染的,这是一种代码气味。也就是说,可以通过
动态\u cast

for (auto base : myVector) {
    if (auto derived = dynamic_cast<DerivedClass*>(base)) {
        derived->render();
    }
}

你确信这是C++ +?@ SU3,这是一个较旧的MSVC语法,因为它们支持基于标准范围的循环,所以它被贬低了。听起来就像是在引擎盖下面做了一个<代码> STATICEXCAST ,所以你不能检查后验。如何使用<代码> >代码>和“用代码>动态DealCysCase<代码>手动向下压缩?另一种方法是在您的基点中实现<代码> Read()/<代码>,即使它不做任何事情,但您确信这是C++ +?@ SU3,它是一个较旧的MSVC语法,自从他们支持标准的基于范围的for循环以来就被弃用了。听起来它只是在引擎盖下进行了一个
static\u cast
,所以你不能检查后验。使用
基类*
进行迭代,并使用
动态\u cast
手动向下转换如何?另一种解决方法是在您的基类中实现
渲染()
,即使它不会做任何事情。您测试过吗?您测试过吗?
foreach (var body in myVector.OfType<DerivedClass>()) {
    body.render();
}