如何制作模板抽象类的列表

时间:2014-02-18 11:30:15

标签: c++ list class templates abstract

我必须要做一个模板抽象基类列表(我也有交付的类) 但是我不能对列表中的元素进行初始化,因为该元素是一个抽象类......

这是我的声明:

/* fsm (list node) declaration */
template<class step_type> class fsm {
    protected:
        step_type   step;
        step_type   step_old;
        step_type   step_tmp;
        char        name[256];
        fsm *next;
        fsm *prev;
    public:
        fsm(step_type step);
        virtual void update() = 0;
        void show(){cout << step << ' ' << step_tmp << '\n'; };
        void init(step_type st_current) {step = st_current;};
//metodi per gestione nodo lista
        step_type getStep()     { return step; }
        fsm* getNext()          { return next; }
        fsm* getPrev()          { return prev; }

        void setStep(step_type s)   { step = s; }
        void setNext(fsm *n)        { next = n; }
        void setPrev(fsm *p)        { prev = p; }

};

/* fsm_List declaration */
template <class step_type>
class fsm_List
{
    fsm<step_type> *head, *tail;
    int size;

public:
    fsm_List();

    fsm<step_type>* getHead()    { return head; }
    fsm<step_type>* getTail()    { return tail; }
    int getSize()        { return size; }

    void insert(fsm<step_type> *n);    // add node to list
    void insert(step_type &value);        // new node and add in list
    fsm<step_type> *search(step_type &value);    //first node with value
    void delnode(fsm<step_type> *n);    // remove node
    int delvalue(step_type &value);        // remove all nodes

};

这是我提供的课程:

class deri_pinza : public fsm<pin_steps>{
    private:
        bool    cmd_prelevamento_done;
    public:
        deri_pinza(): fsm<pin_steps>(ST_PIN_BOOT){
            cmd_prelevamento_done = false;
        };
        void update();
};

其中:

enum pin_steps {
    ST_PIN_BOOT,
    ST_PIN_CHECK_MOTORE,
    ST_PIN_ZERO_MOTORE,
    ST_PIN_WAIT_ZERO_MOTORE,
    ST_PIN_OPEN,
    ST_PIN_READY,
};

我试着在我的主要考试,但这是错误的......

    fsm<pin_steps> *one, *two, *three, *four, *five;

    one = new fsm<pin_steps>(ST_PIN_CHECK_MOTORE);
    two = new fsm<pin_steps>(ST_PIN_ZERO_MOTORE);
    three = new fsm<pin_steps>(ST_PIN_WAIT_ZERO_MOTORE);
    four = new fsm<pin_steps>(ST_PIN_OPEN);
    five = new fsm<pin_steps>(ST_PIN_READY);


    fsm_List<pin_steps> *mylist = new fsm_List<pin_steps>();

    (*mylist)+=(*one);
    (*mylist)+=(*two);


    mylist->insert(one);
    mylist->insert(two);


    cout << *mylist << endl;

如何在不使用fsm(抽象类)的情况下对列表进行初始化?

1 个答案:

答案 0 :(得分:1)

您无法使用 new 创建fsm<>的实例,因为它是抽象的 - 它包含纯虚方法virtual void update()=0;

你可以举例如:

fsm<pin_steps> *one...
one = new deri_pinza;

这是合法的 - 从这里开始......

编辑 - 跟进我们的评论:

如果你需要一个更通用的派生分析(一个泛型),它可以定义为:

template <typename STEP_TYPE>
class deri_pinza_gen : public fsm<STEP_TYPE> {
private:
    bool cmd_prelevamento_done;
public:
    deri_pinza_gen(STEP_TYPE step) : fsm<STEP_TYPE>(step){
        cmd_prelevamento_done = false;
    };
    virtual void update();
    virtual ~deri_pinza_gen();
};

然后:

mylist->insert( new deri_pinza_gen<pin_steps>(ST_PIN_BOOT) );
mylist->insert( new deri_pinza_gen<pin_steps>(ST_PIN_CHECK_MOTORE) );

ANOTHER_list->insert( new deri_pinza_gen<ANOTHER_pin_steps>(ANTHER_enum_item) );
...

是有效插入。我在这里声明了update()虚拟,所以如果你需要,可以从这个派生你的deri_pinza。