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

时间:2015-05-30 14:59:33

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

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

我的问题如下:

首先,我有这个类图:

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()不是&#39; RocketPart&#39;

的成员

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

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

2 个答案:

答案 0 :(得分:1)

我假设static_cast<ActualClassThisIs*>(m_parts[i])->getThrust(); 是指向公共基类的指针向量?

然后你需要downcast到正确的班级,比如

dynamic_cast

请注意,这只适用于类继承自基类的情况。另请注意,如果实际的类不是,那么它将无效。然后,您可能必须使用nullptr并检查if (dynamic_cast<ActualClassThisIs*>(m_parts[i]) != nullptr) dynamic_cast<ActualClassThisIs*>(m_parts[i])->getThrust();

<script type='text/javascript'>//<![CDATA[
$(window).load(function(){
$(document).ready(function () {
var myInterval = false;
myInterval = setInterval(AutoScroll, 5000);

function AutoScroll() {
    var iScroll = $(window).scrollTop();
    iScroll = iScroll + 500;
    $('html, body').animate({
        scrollTop: iScroll
    }, 1000);
}

$(window).scroll(function () {
    var iScroll = $(window).scrollTop();
    if (iScroll == 0) {
        myInterval = setInterval(AutoScroll, 5000);
    }
    if (iScroll + $(window).height() == $(document).height()) {

        clearInterval(myInterval);

        setTimeout(function(){ window.location.href = "index.php"; },3000)  

    }
});
});
});//]]>  

</script>

答案 1 :(得分:0)

你的最后一部分,

  

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

抱歉,您的图表在我的屏幕上无法读取,因此我创建了一些名称。