使用一个函数指针指向来自不同类的两个不同的成员函数

时间:2016-10-03 16:24:22

标签: c++ class function-pointers encapsulation

我正在训练封装一些代码,为此我创建了三个类,分别是Vero,Pionner和Vehicle。前两个类具有成员变量cmd和成员函数getcmd - 在每个类中,这些成员略有不同。然后。我们有类Vehicle,它是Vero和Pionner的子类。 Vehicle构造函数具有参数 which_car ,应该用于选择我们要使用的两个类中的哪一个。

我想要某种函数指针,它可以指向类Vero或类Pionner的getcmd成员函数。怎么可以执行这个任务?

评论:我不是在问如何创建一个成员点。我问我怎么能以某种方式创建一个可以指向Vero对象或Pionner对象的泛型类型。

我正在处理的代码。

标题

#ifndef VEHICLE_H
#define VEHICLE_H

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <ransac_project/CarCommand.h>


class Vero{
public:
    ransac_project::CarCommand cmd;

    Vero();
    void getcmd(const double &velocity, const double &steering);
};


class Pionner{
public:
    geometry_msgs::Twist cmd;

    Pionner();
    void getcmd(const double &linear_vel, const double &angular_vel);
};


class Vehicle: public Vero, public Pionner{
public:
    Vehicle(const std::string &which_car);
    void (*arrangemessage) (const double &, const double &);
};

#endif /* VEHICLE_H */

来源

#include "vehicle.hpp"

Vero::Vero(){
    cmd.speedLeft  = 0.0; cmd.speedRight = 0.0; cmd.steerAngle = 0.0;
    return;
}

void Vero::getcmd(const double &velocity, const double &steering){
    cmd.speedLeft  = velocity;
    cmd.speedRight = velocity;
    cmd.steerAngle = steering;
    return;
}

Pionner::Pionner(){
    cmd.linear.x  = 0.0; cmd.linear.y  = 0.0; cmd.linear.z  = 0.0;
    cmd.angular.x = 0.0; cmd.angular.y = 0.0; cmd.angular.z = 0.0;
    return;
}

void Pionner::getcmd(const double &linear_vel, const double &angular_vel){
    cmd.linear.x = linear_vel;
    cmd.linear.y = 0;
    cmd.linear.z = 0;
    cmd.angular.x = 0;
    cmd.angular.y = 0;
    cmd.angular.z = angular_vel;
    return;
}


Vehicle::Vehicle(const std::string &which_car){
    if(which_car.compare("vero")==0){
        arrangemessage = &Vero::getcmd;
    }
    else if(which_car.compare("pionner")==0){
        arrangemessage = &pionner.getcmd;
    }
    else{
        ROS_INFO_STREAM("which_car must be vero or pionner");
        exit(0);
    }
}

0 个答案:

没有答案