假设:
class Propulsion () {}; //abstract
class GenericDualMotor : public Propulsion {}; // also abstract
class Motor1 : public GenericDualMotor () {}; // Concrete
class Motor2 : public GenericDualMotor () {}; // Concrete
class Motor3 : public GenericDualMotor () {}; // Concrete
class Dispatcher { // concrete but not a descendant of Propulsion
public:
template<class T>
T *_motor;
Dispatcher(T motor) : _motor(motor){};
void forward() {
_motor->forward();
}
};
&#34;前进&#34;方法在推进中声明为:
virtual void forward(int speed) = 0; // abstract
但在每个Motor类中,它被声明为具体:
void forward(int speed) {
// motor-specific code here...
}
在Main,我声明:
Motor1 motor();
Dispatcher dispatcher(&motor);
这无法通知通知:&#34;错误:数据成员&#39; _motor&#39;不能成为会员模板&#34;
我想要做的是在编译时决定使用哪种电机类型,并且能够在不更改Dispatcher或GenericDualMotor类代码的情况下添加新的电机类型。我怀疑模板是在这里使用的正确机制,但我仍然没有完全&#34; grok&#34;模板。我想这是一个简单的代码修复。在此先感谢您的帮助。
答案 0 :(得分:3)
您不需要模板 - 这就是拥有virtual
功能的重点。只是:
class Dispatcher { // concrete but not a descendant of Propulsion
public:
Propulsion* _motor;
Dispatcher(Propulsion* motor) : _motor(motor){};
void forward(int speed) {
_motor->forward(speed);
}
};
这适用于继承自Propulsion
的所有内容,包括您的所有Motor
。
答案 1 :(得分:2)
这正是多态性的意义所在。不需要模板。
class Propulsion {
public:
virtual ~Propulsion() {}
virtual void forward(int speed) = 0;
};
class GenericDualMotor : public Propulsion {
};
class Motor1 : public GenericDualMotor {
public:
void forward(int speed);
};
class Motor2 : public GenericDualMotor {
public:
void forward(int speed);
};
class Motor3 : public GenericDualMotor {
public:
void forward(int speed);
};
class Dispatcher {
public:
Propulsion *_motor;
Dispatcher(Propulsion *motor) : _motor(motor) {};
void forward() {
_motor->forward(some speed value here);
}
};
Motor1 motor;
Dispatcher dispatcher(&motor);