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
Post a Comment