我在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'没有类型
答案 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;
};