おはようコミュニティ。私は 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?
それはすでに何関数が返すだとき、 'A2SimVehicle *'へgetRealLeader' 'の結果をキャストのポイントは何ですか?さらにパラメータが 'simVehicleParticular *' - 'A2SimVehicle'から派生したクラスへのポインタです。 getRealLeaderから結果をダウンキャストする必要があります。 –
'simVehicleParticular'は、そのクラスから派生した' A2SimVehicle'の一種です。もう一方の方法は真実である必要はありません。 –
@DanMašek、あなたはgetRealLeaderからの結果をダウンキャストすることによって何を意味するのか説明できますか? – bazooka