2016-04-01 123 views
-2

早上好社区。我确实有这个头文件,它被称为SimVehicleParticular如何在C++中调用函数

enter code here 
#ifndef _simVehicleParticular_h_ 
#define _simVehicleParticular_h_ 

#include "A2BehavioralModelUtil.h" 
#include "A2SimVehicle.h" 

class A2BEHAVIORALEXPORT simVehicleParticular: public A2SimVehicle 
{ 
private: 
float newAttribute; 

public: 
simVehicleParticular (void *handlerVehicle, unsigned short idhandler,bool isFictitiousVeh); 
~ simVehicleParticular(); 
const float getnewAttribute() const; 
void setnewAttribute (float avalue); 
}; 

#endif 

我也有被称为A2SimVehicle另一头和它的部分包括:

enter code here 
#ifndef _A2SimVehicle_h_ 
#define _A2SimVehicle_h_ 

#include "A2BehavioralModelUtil.h" 

typedef A2BEHAVIORALEXPORT struct yieldInfo{ 
double distance2ConfVehiclePrio; 
double distance2ConfVehicleGiveWay; 
bool isVehiclePrioWithinVisibility; 
bool isVehiclePrioRealAndReachingConflict; 
bool isVehicleGiveWayComingNext; 
bool isVehiclePrioAfectedByStop; 
bool isVehiclePrioAfectedByYellowBox; 
bool isVehiclePrioAfectedByGiveWay; 
bool isVehiclePrioPrioritaryBasedOnWaitingTime; 
bool isVehiclePrioComingNext; 
bool isVehiclePrioLeaderOfVehicleGiveWay; 
double passingTimeVehiclePrio; 
double leavingTimeVehiclePrio; 
double passingTimeVehicleGiveWay; 
double leavingTimeVehicleGiveWay; 
double safetyMargin; 
} yieldInfo; 


enter code here 
class A2BEHAVIORALEXPORT A2SimVehicle 
{ 
public: 
A2SimVehicle(void *handlerVehicle, unsigned short idhandler, bool isFictitiousVeh); 
virtual ~A2SimVehicle(); 

/*! 
    Internal function to be used only by the microsimulator 
*/ 
void setHandlerVehicle(void *handlerVehicle); 
void * getHandlerVehicle() {return handlerVehicle;}; 

一个它的成员是:

enter code here 
A2SimVehicle * getRealLeader(double &Shift) const; 

现在就源文件而言,我想调用一个函数,如下所示:

enter code here 
double behavioralModelParticular::getIDMDeceleration(simVehicleParticular *vehicle, simVehicleParticular *leader) 
{ 
//int id = vehicle->getId(); 
//int idl = leader->getId(); 

double Shift; 
Shift = 0; 
double ShiftLeader; 
ShiftLeader = 0; 
simVehicleParticular *tempVeh; 
int idT; 
double a = vehicle->getAcceleration(); 
double b = vehicle->getDeceleration(); 
double VelAnterior, PosAnterior, VelAnteriorLeader, PosAnteriorLeader; 
double GapAnterior = vehicle->getGap(Shift, leader, ShiftLeader, PosAnterior, VelAnterior, PosAnteriorLeader, VelAnteriorLeader); 
double DesiredGap = getIDMMinimumGap(vehicle, leader, VelAnterior, VelAnteriorLeader, GapAnterior); 
double X = VelAnterior/vehicle->getFreeFlowSpeed(); 
double acceleration = max(b, a*(1 - pow(X, 4) - (DesiredGap/GapAnterior)*(DesiredGap/GapAnterior))); 
return acceleration; 
} 

我的问题是,我想调用这个函数是这样的:

double accelcurrent = getIDMDeceleration((simVehicleParticular *)vehicle, (A2SimVehicle *)vehicle->getRealLeader(temp)); 

然而,当我把:

(A2SimVehicle *)vehicle->getRealLeader(temp)) 

会出现一个警告它说:

错误:“A2SimVehicle”类型的参数与 “SimVehicleParticular”类型的参数不兼容。

你能告诉我如何正确地结合上面描述的头文件来调用这个函数吗?任何帮助将深受赞赏。

谢谢!

我改变了功能:

double behavioralModelParticular::getIDMDeceleration(simVehicleParticular*vehicle, A2SimVehicle*leader). However , now a line inside the function doesn't reognize the leader. 


double DesiredGap = getIDMMinimumGap(vehicle, leader, VelAnterior, VelAnteriorLeader, GapAnterior); 

我也离开了:

double accelcurrent = getIDMDeceleration((simVehicleParticular *)vehicle, (A2SimVehicle *)vehicle->getRealLeader(temp)); the same. What happens now? 
+1

什么是铸造'getRealLeader'的结果'A2SimVehicle *'点,当这已经是函数返回的是什么?甚至当参数是'simVehicleParticular *'时 - 一个指向从'A2SimVehicle'派生的类的指针。你需要从'getRealLeader'下翻结果。 –

+0

'simVehicleParticular'是一种'A2SimVehicle',因为它来源于该类。反过来也不一定是真的。 –

+0

@DanMašek,你可以向我解释一下getRealLeader的结果是什么意思。 – bazooka

回答

0

你的函数的定义是:

double behavioralModelParticular::getIDMDeceleration(simVehicleParticular *vehicle, simVehicleParticular *leader) 

这表示,该leader参数是键入指向simVehicleParticular类型的指针。

当你调用该函数

double accelcurrent = getIDMDeceleration((simVehicleParticular *)vehicle, (A2SimVehicle *)vehicle->getRealLeader(temp)); 

你给它一个临时变量是呼叫vehicle->getRealLeader(temp)的结果,然后将它强制转换为指针的类型A2SimVehicle!所以功能getIDMDeceleration()得到一个类型A2SimVehicle*。编译器告诉你这种类型与simVehicleParticular*不兼容。

您将不得不使功能getRealLeader()返回simVehicleParticular*或使功能getIDMDeceleration()接受领导者作为A2SimVehicle*的类型。

double behavioralModelParticular::getIDMDeceleration(simVehicleParticular* vehicle, A2SimVehicle* leader) 

simVehicleParticular* getRealLeader(double &Shift) const;