我有一个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);
我认为我缺少一些基本概念,而且肯定弄乱了一些语法。请您帮我正确定义一下。
最佳答案
以下操作无效,因为您无法使用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);