C++

2016-04-01 5 views
-2

Günaydın topluluğundaki bir işlevi nasıl çağırılır. Ben SimVehicleParticularC++

adlandırılan bu başlık dosyasını, var
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 
Ben de A2SimVehicle denir başka başlık ve bunun bir parçası olan

içermektedir:

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

Bir üye en olduğunu bulunuyor:

Şimdi, kaynak dosya söz konusu olduğunda, şöyle bir işlev çağırmak istiyorum:

Ben koyduğunuzda, Ancak

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

:

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

Sorum Böyle bu işlevi çağırmak istiyorum yani,

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

bir uyarı diyor ki görünür:

hata : "A2SimVehicle" türünün argümanı, "SimVehicleParticular" türünde parametreyle uyumsuz.

Bu işlevi, yukarıda anlattığım üstbilgileri doğru bir şekilde nasıl arayacağımı söyler misiniz? Herhangi bir yardım, derinden takdir edilecek.

Teşekkür ederiz!

Ben fonksiyonu değişmiş: Ben de sol

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

'* A2SimVehicle' için 'getRealLeader' sonucunu döküm noktası zaten hangi işlevi döner olduğunda, ne? Parametre 'simVehicleParticular *' olduğunda daha da fazla - A2SimVehicle'den türetilen bir sınıfa işaretçi. Sonuçları getRealLeader'dan düşürmeniz gerekiyor. –

+0

A “simVehicleParticular”, bu sınıftan türediği gibi bir tür “A2SimVehicle”. Diğer yolun gerçek olması gerekmiyor. –

+0

@ DanMašek, bana, getRealLeader'dan gelen sonucu indirerek ne demek istediğinizi açıklayabilir misiniz? – bazooka

cevap

0

senin fonksiyonun tanımı şöyledir: leader parametre ait olduğunu söyler

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

simVehicleParticular türüne işaretçi yazın.

Eğer fonksiyonu

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

bunu aramanın vehicle->getRealLeader(temp) sonucudur geçici bir değişken vermek ve sonra A2SimVehicle göstericileri türüne gönderilir typecasting diyoruz

! Yani getIDMDeceleration() işlevi A2SimVehicle* türüne sahip olur. Ve derleyici size bu türün simVehicleParticular* ile uyumlu olmadığını söylüyor.

Sen işlevi getRealLeader() bir simVehicleParticular* iade veya fonksiyon getIDMDeceleration()A2SimVehicle* türü olarak liderini kabul etmesi için yapmak ya sahip olacaktır.

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

veya

simVehicleParticular* getRealLeader(double &Shift) const;