2016-04-01 12 views
-2

おはようコミュニティ。私は 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 

SimVehicleParticular

と呼ばれ、このヘッダファイルを、持っている私も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; 

ソースファイルに関しては、次のような関数を呼び出す必要があります。

私が置いたとき、しかし

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

私の質問は、私はこのように、この関数を呼び出したいということ、である

(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

それはすでに何関数が返すだとき、 'A2SimVehicle *'へgetRealLeader' 'の結果をキャストのポイントは何ですか?さらにパラメータが 'simVehicleParticular *' - 'A2SimVehicle'から派生したクラスへのポインタです。 getRealLeaderから結果をダウンキャストする必要があります。 –

+0

'simVehicleParticular'は、そのクラスから派生した' A2SimVehicle'の一種です。もう一方の方法は真実である必要はありません。 –

+0

@DanMašek、あなたはgetRealLeaderからの結果をダウンキャストすることによって何を意味するのか説明できますか? – bazooka

答えて

0

あなたの関数の定義は次のとおりです。

leaderパラメータがであると言う
double behavioralModelParticular::getIDMDeceleration(simVehicleParticular *vehicle, simVehicleParticular *leader) 

タイプポインタsimVehicleParticularにタイプします。

あなたはそれを呼び出しvehicle->getRealLeader(temp)の結果であり、その後、あなたがA2SimVehicleへのポインタの型に型キャスト一時変数を与える

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

関数を呼び出します!関数getIDMDeceleration()A2SimVehicle*となります。コンパイラは、このタイプはsimVehicleParticular*と互換性がないことを伝えています。

あなたはsimVehicleParticular*を返すか、機能getIDMDeceleration()A2SimVehicle*の種類として指導者を受け入れる作るために機能getRealLeader()を作るためにどちらかがあります。

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

または

simVehicleParticular* getRealLeader(double &Shift) const;