此处有错误:
Rocket.cpp:31:16: error: no member named 'getThrust' in 'RocketPart'
rocket[0]->getThrust();
当我想通过getThrust()
Engine
上的vector<RocketPart*> rocket
rocket[i]->getThrust()
访问Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim p As Parameter = SQLDataSource.SelectParameters("Order_id")
If IsNothing(p) Then
SQLDataSource.SelectParameters.Add("Order_id", Server.HtmlEncode(Request.QueryString("Order_id")).ToString())
End If
End Sub
时,我会从问题的顶部收到错误消息。
我究竟做错了什么?是否可以通过rocket [index] - &gt; getThrust()?
答案 0 :(得分:2)
类RocketPart
内部没有函数getThrust()
,这就是为什么调用函数的向量不起作用的原因。如果getThrust()
是将在从它继承的类中使用的常用例程,则应将其作为虚函数添加到基类中,如下所示:
class RocketPart {
public:
RocketPart();
RocketPart(const RocketPart& orig);
virtual ~RocketPart();
virtual float getThrust();
virtual void print() = 0;
protected:
// some members
};
答案 1 :(得分:1)
您收到的错误是正确的:类getThrust
中没有名为RocketPart
的函数。你可以:
virtual float getThrust()
课程中添加RocketPart
。这可能不是一个好的解决方案,因为并非所有RocketPart
都可以包含推力;但是,您可以简单地return 0
,或者将其设为纯虚函数(这意味着您不再需要创建RocketPart
对象 dynamic_cast
您的RocketPart
个对象加入Engine
。这可以通过以下方式完成:
for (size_t r = 0; r < rocket.size(); ++r)
{
if (const Engine* engine = dynamic_cast<Engine*>(rocket[r]))
{
// able to successfully convert this RocketPart into an Engine
engine.getThrust();
}
}
您将无法投放任何不属于RocketPart*
Engine
答案 2 :(得分:0)
您需要添加
virtual float getThrust() = 0;
在RocketPart
课程中。
此外,我完全没有理由使用虚拟继承(仅当你从多个类和继承The Diamond Problem时才需要这样做),所以相反:
class Engine : virtual public RocketPart {
你应该只是:
class Engine : public RocketPart {
我还建议查看你的内存分配 - 如果你的示例源代码不只是一个例子(你正在泄漏Engine
个对象,也许vector<shared_ptr<Engine>>
会是一个更好的主意吗?)
答案 3 :(得分:0)
这是因为存储在容器中的类型是RocketPart。 您需要向下转换指向Engine的指针。 而不是
rocket[0]->getThrust();
你需要写:
Engine *pPart = (Engine *) rocket[i]; //you can use also static_cast<> or dynamic_cast<>
pPart->getThrust();
使用演员时要小心:如果rocket [i]不是引擎,程序可能会崩溃。
答案 4 :(得分:0)
方法getThrust()在Engine类中定义,而不是在RocketPart中定义。 您需要在基类RocketPart中移动该方法,以便通过向量访问它。 或者,您也可以使用动态强制转换来转换&#34; RocketPart到引擎。
Engine* engine = dynamic_cast<Engine>(rocket[index]);
if (engine) {
engine->getThrust();
}
考虑使用dynamic_cast通常意味着糟糕的设计。