通知创建指针类A到类B1或B2或B3

时间:2016-06-14 23:08:17

标签: c++ templates

假设:

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;模板。我想这是一个简单的代码修复。在此先感谢您的帮助。

2 个答案:

答案 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);