Объект со статическими и константными переменными-членами - PullRequest
0 голосов
/ 18 июня 2019

Во встроенном 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 оптимизировать константные переменные (например, поместить их во флэш-память)?

1 Ответ

2 голосов
/ 18 июня 2019

Будет предложена следующая структура класса. Вместо указателя на функцию просто повторно установите заданную скорость.

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