访问其对象位于模板 class 向量中的特定子 class 函数

Access specific child class functions whose objects are in a template class vector

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

我的问题如下:

首先,我有这个 class 图:

diagram

此外,我还有另一个 class Rocket,它有一个 vector,它应该包含所有火箭部件作为我生成的指针。 我的问题是 Rocket class 包含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;
}

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

getThrust() is not a member of 'RocketPart'

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

的内容

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

我假设 m_parts 是一个指向公共基数的指针向量 class?

那你需要downcast到正确的class,喜欢

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

请注意,这仅在 class 从基础 class 继承时有效。另请注意,如果实际 class 不是 您将其投射到的内容,它将不起作用。那么您可能必须使用 dynamic_cast 并检查 nullptr:

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

你的最后一部分,

How do I declare a vector within Rocket that is able to contain all subclasses of RocketPart and in the main how do I call calcTWR(), so that it actually gives back the total thrust, regardless of the contents of the vector?

可以通过以下方式完成:

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();
}

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