i trying write class uses dom write list of registrations file xml. list of registrations contains 3 types of registration registration
standard base registration class guestregistration
, studentregistration
both derive registration
.
the guestregistration
class has unique member category
, student registration has unique member qualification
.
when iterate on list of registration pointers have access base class registration
's member functions. there way can access subclasses' data members use getter functions getcategory
, getqualification
? i've tried creating guestregistration
, studentregistration
pointer whenever class name matches either of two, pointer conversion error.
void registrationlistwriter::write(registrationlist r) { qlist<registration*> reglist = r.getregistrationlist(); (int = 0; < reglist.size(); ++i) { qstring cn = reglist.at(i)->metaobject()->classname(); person tempperson = reglist.at(i)->getattendee(); appendregistrationandtype(cn); appendattendee(tempperson); //this issue starts if (cn == "guestregistration") { guestregistration guestreg = reglist.at(i); appendattendeecatagory(guestreg.getcatagory()); } if (cn == "studentregistration") { studentregistration* stureg = reglist.at(i); appendattendeequalification(stureg->getqualification()); } appendbookingdate(reglist.at(i)->getbookingdate().tostring()); appendregistrationfee(reglist.at(i)->calculatefee()); } }
you can use dynamic_cast
check specific sub-classes:
void registrationlistwriter::write(registrationlist r) { qlist<registration*> reglist = r.getregistrationlist(); (int = 0; < reglist.size(); ++i) { registration *reg = reglist.at(i); appendregistrationandtype(reg->metaobject()->classname()); appendattendee(reg->getattendee()); if (guestregistration *guestreg = dynamic_cast<guestregistration*>(reg)) { appendattendeecatagory(guestreg->getcatagory()); } else if (studentregistration* stureg = dynamic_cast<studentregistration*>(reg)) { appendattendeequalification(stureg->getqualification()); } // , on ... appendbookingdate(reg->getbookingdate().tostring()); appendregistrationfee(reg->calculatefee()); } }
however, suggest implementing virtual method in registration
class sub-classes can override register additional items needed, eg:
class registration { ... virtual void appendextraattendees(registrationlistwriter *writer){} ... };
class guestregistration : public registration { ... virtual void appendextraattendees(registrationlistwriter *writer); ... }; void guestregistration::appendextraattendees(registrationlistwriter *writer){ writer->appendattendeecatagory(getcatagory()); }
class studentregistration : public registration { ... virtual void appendextraattendees(registrationlistwriter *writer); ... }; void studentregistration::appendextraattendees(registrationlistwriter *writer){ writer->appendattendeequalification(getqualification()); }
void registrationlistwriter::write(registrationlist r) { qlist<registration*> reglist = r.getregistrationlist(); (int = 0; < reglist.size(); ++i) { registration *reg = reglist.at(i); appendregistrationandtype(reg->metaobject()->classname()); appendattendee(reg->getattendee()); reg->appendextraattendees(this); appendbookingdate(reg->getbookingdate().tostring()); appendregistrationfee(reg->calculatefee()); } }
alternatively:
class registration { ... virtual void appendattendees(registrationlistwriter *writer); ... }; void registration::appendattendees(registrationlistwriter *writer){ writer->appendattendee(getattendee()); }
class guestregistration : public registration { ... virtual void appendattendees(registrationlistwriter *writer); ... }; void guestregistration::appendattendees(registrationlistwriter *writer){ registration::appendattendees(writer); writer->appendattendeecatagory(getcatagory()); }
class studentregistration : public registration { ... virtual void appendattendees(registrationlistwriter *writer); ... }; void studentregistration::appendattendees(registrationlistwriter *writer){ registration::appendattendees(writer); writer->appendattendeequalification(getqualification()); }
void registrationlistwriter::write(registrationlist r) { qlist<registration*> reglist = r.getregistrationlist(); (int = 0; < reglist.size(); ++i) { registration *reg = reglist.at(i); appendregistrationandtype(reg->metaobject()->classname()); reg->appendattendees(this); appendbookingdate(reg->getbookingdate().tostring()); appendregistrationfee(reg->calculatefee()); } }
Comments
Post a Comment