访问其对象位于模板 class 向量中的特定子 class 函数
Access specific child class functions whose objects are in a template class vector
我是新来的,希望你能帮助我! :)
我的问题如下:
首先,我有这个 class 图:
此外,我还有另一个 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();
}
抱歉,您的图表在我的屏幕上无法阅读,所以我编了一些名字。
我是新来的,希望你能帮助我! :)
我的问题如下:
首先,我有这个 class 图:
此外,我还有另一个 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();
}
抱歉,您的图表在我的屏幕上无法阅读,所以我编了一些名字。