c++ - 具有静态和常量成员变量的对象
问题描述
在一个嵌入式 c 项目中,我有几个不同类型的电机。该实现具有静态和常量变量,并支持子类型。
它看起来像这样(简化):
// motor.h
// to be global/static
typedef struct
{
int distance;
} motor_instance;
// to be const
typedef const struct motor_hwToken_s
{
motor_instance *self;
void (*setSpeedFunction)(const struct motor_hwToken_s *token, int speed);
int hwPin;
} motor_hwToken_t;
extern motor_hwToken_t motor_A;
void setSpeed(const struct motor_hwToken_s *token, int speed);
// motor.c
void setSpeed(const struct motor_hwToken_s *token, int speed)
{
token -> setSpeedFunction(token, speed);
}
// specialization for DC-motors
void setSpeed_dcMotor(const struct motor_hwToken_s *token, int speed);
// global variable
motor_dc_instance motor_A_instance;
// const variable, known at compile time
motor_hwToken_t motor_A =
{
.self = &motor_A_instance,
.setSpeedFunction = setSpeed_dcMotor,
.hwPin = 0x04 // define an IO-Pin of some sort
};
// main.c
void main(void)
{
setSpeed(&motor_A, 20);
}
虽然代码有效,但很难阅读。我认为面向对象的语言会更有意义?
所以我的问题是:
- 我怎么能在 C++ 中实现它?
- cpp 编译器是否能够优化 const 变量(例如将它们放入闪存中)?
解决方案
建议采用以下类结构。而不是函数指针,只需重新实现设置速度函数。
//! Motor interface class with abstract functions.
class Motor {
public:
virtual ~Motor() = default;
void set_hwPin(int pin) { hwPin = pin; };
virtual void set_speed(int speed) = 0;
private:
int hwPin;
};
class MotorDC : public Motor {
public:
~MotorDC() override = default;
void set_speed(int speed) override {
// Actual implementation for DC motors.
}
};
class MotorAC : public Motor {
public:
~MotorAC() override = default;
void set_speed(int speed) override {
// Actual implementation for AC motors.
}
};
int main()
{
MotorDC mDC;
mDC.set_pin(1);
MotorAC mAC;
mAC.set_pin(2);
// To demonstrate use a pointer to the abstract base class.
Motor* m;
m = &mAC;
m->set_speed(10);
m = &mDC;
m->set_speed(20);
};
推荐阅读
- html - 如何对齐这些 HREF 按钮?
- git - Gitkraken 说 repo 是私有的,但它是公开的
- python - 利用 QFrame 中的特定事件
- javascript - JavaScript switch 中的同时条件
- machine-learning - LSTM 中的 return_sequences
- apache-spark - 用 reducebykey 替换 group by
- .net - Visual Studio 不打开 Resx 文件
- php - 我制作的这个函数每次都会返回一个唯一的字符串吗?
- javascript - 在 Reactjs 中导出默认值
- sql - 如何在 SQL 中减去组之间的平均值?