C++ Аннотация / Объявление конкретного класса
У меня есть класс MotorDefinition и абстрактный класс под названием Motor:
class MotorDefinition {
public:
MotorDefinition(int p1, int p2, int p3) : pin1(p1), pin2(p2), pin3(p3) {}
int pin1 = -1;
int pin2 = -1;
int pin3 = -1;
};
class Motor {
public:
Motor(MotorDefinition d) : definition(d) {}
virtual void forward(int speed) const = 0;
virtual void backward(int speed) const = 0;
virtual void stop() const = 0;
protected:
MotorDefinition definition;
};
У моего автомобиля Zumo есть два мотора:
class MotorTypeZumoLeft : public Motor {
MotorTypeZumoLeft(MotorDefinition def) : Motor(def) {}
void Motor::forward(int speed) const {}
void Motor::backward(int speed) const {}
void Motor::stop() const {}
};
class MotorTypeZumoRight : public Motor {
MotorTypeZumoRight(MotorDefinition def) : Motor(def) {}
void Motor::forward(int speed) const {}
void Motor::backward(int speed) const {}
void Motor::stop() const {};
};
class MotorTypeZumo {
public:
MotorTypeZumo(MotorTypeZumoLeft *l, MotorTypeZumoRight *r) : left(l), right(r) {}
protected:
MotorTypeZumoLeft *left;
MotorTypeZumoRight *right;
};
К сожалению (для меня), это не компилируется:
MotorDefinition lmd(1, 2, 3);
MotorTypeZumoLeft *leftMotor(lmd);
MotorDefinition rmd(4, 5, 6);
MotorTypeZumoRight *rightMotor(rmd);
MotorTypeZumo motors(*leftMotor, *rightMotor);
Я думаю, что мне не хватает некоторых фундаментальных понятий, и я, конечно, испортил синтаксис. Можете ли вы помочь мне определить это правильно, пожалуйста.
1 ответ
Следующее не работает, потому что вы не можете инициализировать переменную указателя с MotorDefinition
пример.
MotorTypeZumoLeft *leftMotor(lmd);
Вы, вероятно, не собирались leftMotor
быть указателем.
MotorTypeZumoLeft leftMotor(lmd);
Аналогично для rightMotor
,
MotorTypeZumoRight rightMotor(rmd);
Вам нужно передать адреса для инициализации motors
:
MotorTypeZumo motors(&leftMotor, &rightMotor);
Однако, если вы намеревались leftMotor
а также rightMotor
чтобы быть указателями, было бы лучше использовать умный указатель, а не необработанный указатель.
auto leftMotor = std::make_unique<MotoTypeZumoLeft>(lmd);
auto rightMotor = std::make_unique<MotoTypeZumoRight>(lmd);
И вы должны изменить MotorTypeZumo
также использовать умные указатели.
class MotorTypeZumo {
public:
MotorTypeZumo(
std::unique_ptr<MotorTypeZumoLeft> &l,
std::unique_ptr<MotorTypeZumoRight> &r)
: left(std::move(l)), right(std::move(r)) {}
protected:
std::unique_ptr<MotorTypeZumoLeft> left;
std::unique_ptr<MotorTypeZumoRight> right;
};
Тогда вы можете просто пройти leftMotor
а также rightMotor
в motors
,
MotorTypeZumo motors(leftMotor, rightMotor);