c ++类继承问题

时间:2014-09-30 10:56:14

标签: c++ inheritance

我遇到了c ++继承的麻烦,我找不到错误。我有一个实现简单的独轮车运动模型的类。

namespace kinematics{

class Unicycle{
    // state variables
    geometry_msgs::Pose2D _state;   ///< position of the robot

    // robot parameters
    float _max_linear_vel;          ///< maximum linear velocity, saturation
    float _b;                       ///< output point offset

    // integration variables
    float _int_step;                ///< integration step

protected:
    void _updateOdometry(float dv, float tr);
    void _ioLinearization(float vx, float vy, double &d, double &t);

public:
    Unicycle();
    Unicycle(float is, float b, float vmax, geometry_msgs::Pose2D initS);
};

}

由于差分驱动器运动模型是单轮脚踏车的扩展,我想使用继承来实现。

#include "unicycle/Unicycle.h"

class DiffDrive: public kinematics::Unicycle {
    //robot parameters
    float _wheel_radius;        ///< wheel radius
    float _wheel_separation;    ///< distance between wheels

    void _wheelSpeed(float dv, float tr, float &rs, float &ls);

public:
    DiffDrive();
    DiffDrive(float wr, float ws, geometry_msgs::Pose2D initS,
        float ts, float vmax, float b);
};

我用这种方式写了构造函数

DiffDrive::DiffDrive(float wr,
                     float ws,
                     geometry_msgs::Pose2D initS,
                     float ts,
                     float vmax,
                     float b)
    :Unicycle(ts,b,vmax,initS), _wheel_radius{wr}, _wheel_separation{ws}{
}

但是当我使用函数_wheelSpeed()

void DiffDrive::_wheelSpeed(float dv, float tr, float &rs, float &ls){
    ls = dv - _wheel_separation*tr/2.f;
    ls = ls/_wheel_radius;

    rs = _wheel_separation*tr/_wheel_radius + ls;
    std::cout << "PARS: " << _wheel_separation << " - " << _wheel_radius << std::endl;

    std::cout << "WHEELS: " << rs << " - " << ls << std::endl;
}

_wheel_separation和_wheel_radius的值与预期值不同:

  

PARS:-179014 - 4.58631e-41

即使使用以下值调用构造函数:

wheel_radius = 0.02;
wheel_sep = 0.04;
_diff_drive = new DiffDrive(wheel_radius,wheel_sep,update_period,vel_max,offset);

请帮助我了解我的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

查看继承和组成之间的差异 想一想: 差动驱动器是独轮车还是差动驱动器是独轮车的一部分? 以这种方式,没有任何继承更有意义:

  • 周期是基类

  • Unicycle是派生类

  • 三轮车是另一个派生类。

差速驱动器是独轮车的一部分。

我认为如果设计是正确的,其余部分将自动落实到位。您获得的值看起来像未初始化的值或已被销毁的对象的值(再次未初始化的值。)

答案 1 :(得分:0)

我弄清楚出了什么问题。我记得在Java中允许从另一个构造函数调用构造函数,以便隐藏一些参数并避免重写整个初始化。例如:

constructor1(par 1, par2){
  par3 = 0;
  constructor2(par1,par2,par3);
}

我不确定这是否正确,但这就是我的想法。 因此,我按以下方式实现了我的构造函数

DiffDrive::DiffDrive(const float wr,
                     const float ws,
                     float ts,
                     float vmax,
                     float b):Unicycle(ts,b,vmax){
    geometry_msgs::Pose2d initS;
    initS.x = 0;
    initS.y = 0;
    initS.theta = 0;

    DiffDrive(wr,ws,initS,ts,vmax,b);

}

不幸的是,这在C ++中是不合法的,它返回了外部构造函数实例化的结果,忽略了内部构造函数。 如果我没有把这个构造函数放在上一个问题中,我很抱歉,但我只是忘了它。我是我的错。 感谢您的帮助,抱歉浪费您的时间。