我是新来的,希望你能帮助我! :)
我的问题如下:
首先,我有这个类图:
此外,我有另一个类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
的内容是什么?
请保持简单,我还是初学者! ;)
答案 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();
}
抱歉,您的图表在我的屏幕上无法读取,因此我创建了一些名称。