2016-04-01 6 views
-2

aufrufen Guten Morgen Gemeinschaft. Ich mache diese Headerdatei haben, die SimVehicleParticular genannt wirdwie eine Funktion in 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 

Ich habe auch einen anderen Header, der A2SimVehicle genannt wird und einen Teil davon umfasst:

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;}; 

eine seiner Mitglieds ist:

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

Jetzt so weit wie die Quelldatei betroffen ist, möchte ich eine Funktion aufrufen, die so geht:

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; 
} 

Meine Frage ist, dass ich diese Funktion wie folgt aufgerufen werden soll:

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

Allerdings, wenn ich gesagt:

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

erscheint eine Warnung, die sagt:

Fehler : Argument vom Typ "A2SimVehicle" ist nicht kompatibel mit Parameter vom Typ "SimVehicleParticular".

Können Sie mir sagen, wie ich diese Funktion korrekt kombiniere, indem ich die beiden oben beschriebenen Header kombiniere? Jede Hilfe whatsover würde sehr geschätzt werden.

Vielen Dank!

geändert ich die Funktion:

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); 

ich das auch links:

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

Was ist der Sinn von * 'A2SimVehicle Ergebnis von' getRealLeader' Gießen ', wenn das ist schon was die Funktion zurück? Noch mehr, wenn der Parameter 'simVehicleParticular *' ist - ein Zeiger auf eine Klasse, die von 'A2SimVehicle' abgeleitet ist. Sie müssen das Ergebnis von 'getRealLeader' reduzieren. –

+0

Ein 'simVehicleParticular' ist eine Art' A2SimVehicle', wie es von dieser Klasse abgeleitet ist. Andersherum muss es nicht stimmen. –

+0

@ DanMašek, können Sie mir erklären, was Sie meinen, indem Sie das Ergebnis von getRealLeader ablehnen. – bazooka

Antwort

0

Die Definition Ihrer Funktion ist:

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

Welche, dass der leader Parameter sagt, ist von Geben Sie den Zeiger auf simVehicleParticular Typ.

Wenn Sie die Funktion aufrufen

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

Sie es eine temporäre Variable geben, die das Ergebnis des Aufrufs ist vehicle->getRealLeader(temp) und dann typisieren Sie es A2SimVehicle auf die Art der Zeiger! So erhält die Funktion getIDMDeceleration() einen Typ A2SimVehicle*. Und der Compiler sagt Ihnen, dass dieser Typ nicht mit simVehicleParticular* kompatibel ist.

Du musst entweder die Funktion getRealLeader() macht ein simVehicleParticular* zurückzukehren oder die Funktion getIDMDeceleration() den Führer als die Art der A2SimVehicle* akzeptieren machen.

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

oder

simVehicleParticular* getRealLeader(double &Shift) const;