2014-02-18 3 views
0

Я должен сделать список шаблонов абстрактных базовых классов (и у меня тоже есть классы) , но я не могу инициализировать элемент из моего списка, потому что этот элемент является абстрактный класс ...как составить список шаблонов абстрактного класса

это мое заявление:

/* 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; 

как я могу inizialize Списка без inizialize ФОГО (абстрактный класс)?

+0

Почему бы не использовать 'std :: list *>'? – Jarod42

+0

@ Jarod42 ... или даже лучше с умными указателями (например, 'std :: list >>) –

+0

@ πάνταῥεῖ ... или даже лучше использовать исходные указатели, но выделять объекты в стеке и позволяют им автоматически разрушаться, когда они выходят за рамки. (Если они не нужны из сферы действия) – user2079303

ответ

1

вы не можете создать экземпляр fsm<> с новой, так как это абстрактно - он содержит чистый виртуальный метод virtual void update()=0;

Вы можете, например:

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

это законно - и продолжение здесь ...

РЕДАКТИРОВАТЬ по нашим комментариям:

, если вам нужен более общий Дери 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 из этого, если вам это нужно.

+0

Я пробовал с этим экземпляром: one = new deri_pinza; Я должен связать этот шаг, например. one = new deri_pinza (ST_PIN_OPEN) все время ?? для всех шагов? – gazza

+0

'deri_pinza' - единственный конкретный класс в примере здесь, так что это единственный, который вы можете вставить. Если вы хотите добавить в список что-то более общее, что' deri_pinza' вам нужен общий конкретный класс ... см. Edit к моему ответу (подожди минутку :) :) – Sigismondo

+0

fischia !!! Я пытаюсь работать ... спасибо sigismondo !! – gazza

Смежные вопросы