模板和抽象类

时间:2014-02-17 15:36:55

标签: c++ class templates abstract-class

我在fsm.h中有这个抽象类:

template<class step_type> class fsm {
    protected:
        step_type   step;
        step_type   step_old;
        step_type   step_tmp;
        bool        step_pulse;
        char        name[256];
        class fsm   *next;
    public:
        fsm(step_type);
        void set_name(char *parent, char *myname);
        void test();
        virtual void update() = 0;
        void show(){cout << step << ' ' << step_tmp << '\n'; };
        void init(step_type st_current) {step = st_current;};
        class fsm   * get_next (void) {return (next); }
        void set_next (class fsm *x) { next = x; }
};

和派生类:

class deri_taglio : public fsm<taglio_steps>{
    private:
        bool    cmd_prelevamento_done;
        bool    cmd_scorrimento_done;

    public:
        deri_taglio(): fsm<taglio_steps>(ST_TAGLIO_CUT_PANEL){
            cmd_prelevamento_done = false;
            cmd_scorrimento_done = false;

        };
        void update(){cout << "deri_taglio\n";};

};

但是如果我在主类中定义一个指向抽象类的指针:

class fsm_master {
public:
    fsm *first;
};

我有这个错误......  ISO C ++禁止声明'fsm'没有类型

2 个答案:

答案 0 :(得分:2)

您的抽象类恰好是一个模板 - 这意味着它并没有真正定义一个类型。这与deri_taglio类不同,它实际上定义了一个类型 - 因为它在派生时实例化抽象类(通过给模板参数一个实际值fsm<taglio_steps>

您需要为此目的定义实际类型,例如:

fsm<taglio_steps> *first;

或者你需要自己创建一个实际类型的抽象类,例如:从中移除任何step_type

答案 1 :(得分:0)

如何创建这样一个真正的抽象类?

class abstract {
public:
    virtual void update() = 0;
}

template<class step_type> class fsm : public abstract {
    ...
}

class fsm_master {
public:
    abstract *first;
};