抽象 类 和构造函数
Abstract classes and constructor
我们正在尝试在 C++ 中使用抽象超级class 实现一个解决方案:
Control是Spline等的超class。
现在,当我们尝试实例化 Spline 类型的对象时,实例化失败并出现两个错误:
- cannot find method with matching parameters for the constructor of class Spline
- cannot allocate an object of abstract type 'Control'
我们如何解决这些问题?
实例化Control类型的Spline并在main中使用它:
RampFunction timeRampFn{0, 100, 2000, 1000};
RampFunction distanceRampFn{0, 0, 0.5f, 1000};
Control ctrl = new Spline(slowDownCoeff, timeRampFn, distanceRampFn);
ctrl.calculateAction(&newRobotState, p_0, p_t, targetTrack, timeFromStart, distanceToTarget);
Control.hpp(抽象超class):
#ifndef CONTROL_HPP
#define CONTROL_HPP
#include <vector>
#include <Data/Track.h>
#include <Data/TrackPoint.h>
#include <Data/RobotState.h>
#include <boost/multiprecision/eigen.hpp>
using Eigen::Vector2f;
using namespace std;
class Control
{
private:
const float FUTURE_INTERVAL = 0.1f;
protected:
const int FUTURE_SIZE = 10;
public:
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget) = 0;
};
#endif
Spline.hpp:
#ifndef SPLINE_HPP
#define SPLINE_HPP
#include <Control/Control.hpp>
using Eigen::Vector2f;
using namespace std;
class Spline : Control
{
private:
struct RampFunction
{
float x_0, val_0;
float x_e, val_e;
};
float slowDownCoeff;
RampFunction timeRampFn;
RampFunction distanceRampFn;
public:
Spline(float slowDownCoeff, RampFunction timeRampFn, RampFunction distanceRampFn)
{
this->slowDownCoeff = slowDownCoeff;
this->timeRampFn = timeRampFn;
this->distanceRampFn = distanceRampFn;
}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget);
};
#endif
Control ctrl = ...
您创建了一个 Control
类型的变量。这是不允许的,因为 Control
是抽象类型。这就是您收到错误 cannot allocate an object of abstract type 'Control'
.
的原因
另一个问题是 Control
没有接受类型为 Spline*
的参数的构造函数。
您可能一直在尝试创建一个指向派生对象的基指针:Control* ctrl = ...
。但是,这会使删除动态分配有问题,因为不允许通过基指针进行删除,因为基的析构函数是非虚拟的。一种解决方案是将析构函数声明为虚拟的。
但仅仅允许删除是不够的。您应该实际执行删除,否则内存可能会泄漏。
这应该是您想要的修改后的代码。
main.cpp
RampFunction timeRampFn{0, 100, 2000, 1000};
RampFunction distanceRampFn{0, 0, 0.5f, 1000};
Control *ctrl = new Spline(slowDownCoeff, timeRampFn, distanceRampFn);
ctrl->calculateAction(&newRobotState, p_0, p_t, targetTrack, timeFromStart,
distanceToTarget);
Control.hpp
#ifndef CONTROL_HPP
#define CONTROL_HPP
#include <vector>
#include <Data/Track.h>
#include <Data/TrackPoint.h>
#include <Data/RobotState.h>
#include <boost/multiprecision/eigen.hpp>
using Eigen::Vector2f;
using namespace std;
class Control
{
private:
const float FUTURE_INTERVAL = 0.1f;
protected:
const int FUTURE_SIZE = 10;
public:
virtual ~Control() {}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget) = 0;
};
#endif
Spline.hpp
#ifndef SPLINE_HPP
#define SPLINE_HPP
#include <Control/Control.hpp>
using Eigen::Vector2f;
using namespace std;
class Spline : Control
{
private:
struct RampFunction
{
float x_0, val_0;
float x_e, val_e;
};
float slowDownCoeff;
RampFunction timeRampFn;
RampFunction distanceRampFn;
public:
Spline(float slowDownCoeff, RampFunction timeRampFn, RampFunction distanceRampFn)
: slowDownCoeff(slowDownCoeff), timeRampFn(timeRampFn), distanceRampFn(distanceRampFn) {}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget);
};
#endif
我们正在尝试在 C++ 中使用抽象超级class 实现一个解决方案: Control是Spline等的超class。 现在,当我们尝试实例化 Spline 类型的对象时,实例化失败并出现两个错误:
- cannot find method with matching parameters for the constructor of class Spline
- cannot allocate an object of abstract type 'Control'
我们如何解决这些问题?
实例化Control类型的Spline并在main中使用它:
RampFunction timeRampFn{0, 100, 2000, 1000};
RampFunction distanceRampFn{0, 0, 0.5f, 1000};
Control ctrl = new Spline(slowDownCoeff, timeRampFn, distanceRampFn);
ctrl.calculateAction(&newRobotState, p_0, p_t, targetTrack, timeFromStart, distanceToTarget);
Control.hpp(抽象超class):
#ifndef CONTROL_HPP
#define CONTROL_HPP
#include <vector>
#include <Data/Track.h>
#include <Data/TrackPoint.h>
#include <Data/RobotState.h>
#include <boost/multiprecision/eigen.hpp>
using Eigen::Vector2f;
using namespace std;
class Control
{
private:
const float FUTURE_INTERVAL = 0.1f;
protected:
const int FUTURE_SIZE = 10;
public:
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget) = 0;
};
#endif
Spline.hpp:
#ifndef SPLINE_HPP
#define SPLINE_HPP
#include <Control/Control.hpp>
using Eigen::Vector2f;
using namespace std;
class Spline : Control
{
private:
struct RampFunction
{
float x_0, val_0;
float x_e, val_e;
};
float slowDownCoeff;
RampFunction timeRampFn;
RampFunction distanceRampFn;
public:
Spline(float slowDownCoeff, RampFunction timeRampFn, RampFunction distanceRampFn)
{
this->slowDownCoeff = slowDownCoeff;
this->timeRampFn = timeRampFn;
this->distanceRampFn = distanceRampFn;
}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget);
};
#endif
Control ctrl = ...
您创建了一个 Control
类型的变量。这是不允许的,因为 Control
是抽象类型。这就是您收到错误 cannot allocate an object of abstract type 'Control'
.
另一个问题是 Control
没有接受类型为 Spline*
的参数的构造函数。
您可能一直在尝试创建一个指向派生对象的基指针:Control* ctrl = ...
。但是,这会使删除动态分配有问题,因为不允许通过基指针进行删除,因为基的析构函数是非虚拟的。一种解决方案是将析构函数声明为虚拟的。
但仅仅允许删除是不够的。您应该实际执行删除,否则内存可能会泄漏。
这应该是您想要的修改后的代码。
main.cpp
RampFunction timeRampFn{0, 100, 2000, 1000};
RampFunction distanceRampFn{0, 0, 0.5f, 1000};
Control *ctrl = new Spline(slowDownCoeff, timeRampFn, distanceRampFn);
ctrl->calculateAction(&newRobotState, p_0, p_t, targetTrack, timeFromStart,
distanceToTarget);
Control.hpp
#ifndef CONTROL_HPP
#define CONTROL_HPP
#include <vector>
#include <Data/Track.h>
#include <Data/TrackPoint.h>
#include <Data/RobotState.h>
#include <boost/multiprecision/eigen.hpp>
using Eigen::Vector2f;
using namespace std;
class Control
{
private:
const float FUTURE_INTERVAL = 0.1f;
protected:
const int FUTURE_SIZE = 10;
public:
virtual ~Control() {}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget) = 0;
};
#endif
Spline.hpp
#ifndef SPLINE_HPP
#define SPLINE_HPP
#include <Control/Control.hpp>
using Eigen::Vector2f;
using namespace std;
class Spline : Control
{
private:
struct RampFunction
{
float x_0, val_0;
float x_e, val_e;
};
float slowDownCoeff;
RampFunction timeRampFn;
RampFunction distanceRampFn;
public:
Spline(float slowDownCoeff, RampFunction timeRampFn, RampFunction distanceRampFn)
: slowDownCoeff(slowDownCoeff), timeRampFn(timeRampFn), distanceRampFn(distanceRampFn) {}
virtual void calculateAction(RobotState *state, Vector2f curPos, Vector2f refPos, Track targetTrack, float timeFromStart, float distanceToTarget);
};
#endif