gpt4 book ai didi

c++ - 抽象类和构造函数

转载 作者:行者123 更新时间:2023-12-01 15:11:10 25 4
gpt4 key购买 nike

我们试图用C++实现抽象父类(super class)的解决方案:
控制是样条线等的父类(super class)。
现在,当我们尝试实例化Spline类型的对象时,实例化失败,并出现两个错误:

  1. cannot find method with matching parameters for the constructor of class Spline
  2. cannot allocate an object of abstract type 'Control'


我们如何解决这些问题?

实例化Control类型的样条线并在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(抽象父类(super 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 = ...。但是,这将导致删除动态分配成为问题,因为由于基的析构函数是非虚拟的,因此不允许您通过基指针进行删除。一种解决方案是将析构函数声明为虚拟。

但是仅仅允许删除是不够的。您实际上应该执行删除操作,否则内存可能会泄漏。

关于c++ - 抽象类和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59392032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com