首页 > 解决方案 > 具有静态和常量成员变量的对象

问题描述

在一个嵌入式 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);
}

虽然代码有效,但很难阅读。我认为面向对象的语言会更有意义?

所以我的问题是:

  1. 我怎么能在 C++ 中实现它?
  2. cpp 编译器是否能够优化 const 变量(例如将它们放入闪存中)?

标签: c++oopembedded

解决方案


建议采用以下类结构。而不是函数指针,只需重新实现设置速度函数。

//! 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);
};

推荐阅读