Casting base class to derived through std iterator in C++ -


in program have base generalheader, macheader derived generalheader , networkpacket member headers std list of generalheader:

//packet.h  enum headertype_t {general_header_type, mac_header_type};  class generalheader { public:     bool valid;     headertype_t headertype;     void printme(); };  struct macheader: public generalheader {     long unsigned destaddr:48;     long unsigned sourceaddr:48;     void printme(); };  struct packet_t {     list<generalheader> headers;//todo generalheader     list<generalheader>::iterator it_header; //todo generalheader     void printme(); }; 

while implementing printme() of packet_t, supposed print headers according headertype: if there generalheader - use generalheader.printme() , if macheader in list - print macheader.printme()) i'm struggling cast it_header iterator base generalheader derived macheader inside packet_t method printme():

//packet.cpp  void generalheader::printme() {     std::cout << "valid " << generalheader::valid << endl;     std::cout << "header type " << generalheader::headertype << endl; };  void hw_macheader::printme() {      std::cout << "------------------------   " << endl;     std::cout << "----   mac header    ---   " << endl;     std::cout << "------------------------   " << endl;      generalheader::printme();  };  void networkpacket_t::printme() {     std::cout << "valid packet " << networkpacket_t::validpacket << endl;      (it_header = headers.begin(); it_header != headers.end(); it_header++) {         switch (it_header->headertype) {         case mac_header_type:                        static_cast<hw_macheader*>(it_header)->printme();             break;         default:             std::cout << "default" << endl;         };         it_header++;     }; }; 

the error: invalid static_cast type 'std::_list_iterator' type 'macheader*'

thank help.

the desired/normal polymorphic way be: redefine printme() virtual function cast not necessary:

class generalheader { public:     bool valid;     headertype_t headertype;     virtual void printme(); };  class macheader: public generalheader {     long unsigned destaddr:48;     long unsigned sourceaddr:48;   public:          void printme(); }; 

also use vector of pointers generalheader:

list<generalheader*>::iterator it_header; 

then can:

(*it_header)->printme(); 

the loop simpler:

  (it_header = headers.begin(); it_header != headers.end();++it_header)        (*it_header)->printme(); 

i don't know why need it_header member of class? can't local loop?


Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -