抽象类和构造函数
Abstract classes and constructor
我们试图在C++中实现一个带有抽象超类的解决方案: 控制是样条和其他的超类。 现在,当我们尝试实例化样条类型的对象时,实例化失败并显示两个错误:
- 找不到具有类样条构造函数匹配参数的方法
- 无法分配抽象类型为"控件"的对象
我们如何解决这些问题?
实例化类型控件的样条曲线并在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 (抽象超类(:
#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
样条线.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 = ...
。但是,这会使删除动态分配成为问题,因为不允许通过基指针删除,因为基的析构函数是非虚拟的。解决方案是声明析构函数虚拟。
但是,仅仅允许删除是不够的。您应该实际执行删除,否则内存可能会泄漏。
这应该是您想要的修改代码。
主.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);
控制.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
样条线.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++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- C++ - 从另一个类构造函数调用类构造函数
- 定义结构中没有默认构造函数的类
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 是否可以默认初始化具有已删除默认构造函数的类类型
- C++具有移动和复制构造函数的类中的代码重复
- 没有默认构造函数的类对象的值初始化