繁体   English   中英

访问其对象在模板类向量中的特定子类函数

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

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

我的问题如下:

首先,我有这个类图:

另外,我还有另一个类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();似乎不起作用rocket.calcTWR(); 可以解决:编译器说

getThrust()不是'RocketPart'的成员

我很了解,但是如何解决呢? 如何在Rocket中声明一个向量,该向量能够包含RocketPart所有子类,并且在main RocketPart中,我如何调用calcTWR() ,以便无论vector的内容如何,​​它实际上都会返回总thrust

请保持简单,我仍然是初学者! ;)

我假设m_parts是指向通用基类的指针的向量?

然后,您需要下调至正确的课程,例如

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

最后一部分

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM