【问题标题】:Access specific child class functions whose objects are in a template class vector访问其对象在模板类向量中的特定子类函数
【发布时间】:2015-05-30 14:59:32
【问题描述】:

我是新来的,希望你能帮助我! :)

我的问题如下:

首先,我有这个类图:

diagram

此外,我还有另一个类Rocket,它有一个vector,它应该包含所有火箭部件作为我生成的指针。 我的问题是Rocket类包含3种计算方法,例如:

template<typename T>
double Rocket<T>::calcTWR(){
    double thrust = 0;
    for (int i = 0; i < m_parts.size();i++){
        thrust += m_parts[i]->getThrust();
    }
    return thrust;
}

是的,我使用了模板,因为我不完全确定如何处理所有这些子类,并且我认为模板可能适合这里。另外,这就是问题出现的地方,调用rocket.calcTWR(); 似乎无法处理它:编译器说

getThrust() 不是“RocketPart”的成员

我明白了,但是如何解决呢?如何在Rocket 中声明一个能够包含RocketPart 的所有子类的向量,在main 中如何调用calcTWR(),以便它实际上返回总thrust,而不管vector的内容?

请保持简单,我还是个初学者! ;)

【问题讨论】:

    标签: c++ templates vector subclass multiple-inheritance


    【解决方案1】:

    我假设m_parts 是指向公共基类的指针向量?

    那你需要downcast到正确的类,比如

    static_cast<ActualClassThisIs*>(m_parts[i])->getThrust();
    

    请注意,这只适用于类继承自基类的情况。另请注意,如果实际的类 不是 您将其转换为的内容,它将不起作用。然后你可能不得不使用dynamic_cast 并检查nullptr

    if (dynamic_cast<ActualClassThisIs*>(m_parts[i]) != nullptr)
        dynamic_cast<ActualClassThisIs*>(m_parts[i])->getThrust();
    

    【讨论】:

      【解决方案2】:

      你的最后一部分,

      如何在 Rocket 中声明一个能够包含 RocketPart 的所有子类的向量,以及主要如何调用 calcTWR(),以便它实际上返回总推力,而不管向量的内容如何?

      可以通过以下方式完成:

      class IPart {
          virtual double getThrust() = 0;
      }
      class MetalPart : public IPart {
          double getThrust() override { return 5.5; }
      }
      class PlasticPart : public IPart {
          double getThrust() override { return 3.3; }
      }
      class CrappyPart : public IPart {
          double getThrust() override { return 1.1; }
      }
      

      然后你把它们放在一个

      std::vector<IPart*> parts;
      

      然后可以用这样的方法计算总推力:

      double total = 0;
      for(auto part : parts) {
          total += part->getThrust();
      }
      

      抱歉,您的图表在我的屏幕上不可读,所以我编了一些名字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-03
        • 2021-05-09
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多