std:: карта указателей базового класса
Я пишу код для хранения результатов экзаменов для разных степеней (физика и химия в настоящее время).
У меня есть абстрактный базовый класс student
, который выглядит следующим образом:
class student{
public:
virtual ~student(){}
//virtual function to add course + mark
virtual void addresult(std::string cName,int cCode,double cMark)=0;
//virtual function to print data
virtual void printinfo()=0; //to screen
virtual void outputinfo(std::string outputfilename)=0; //to file
};
Тогда у меня есть производный класс для физики (и будет иметь аналогичный класс для химии):
class physics : public student{
protected:
std::string studentname;
int studentID;
std::map<int,course> courses; //map to store course marks
public:
//constructors/destructors
void addresult(std::string cName,int cCode,double cMark){course temp(cName,cCode,cMark);courses[cCode]= temp;}
void printinfo(){
//function to output information to screen
}
void outputinfo(std::string outputfilename){
//function to write student profile to file
}
};
В моем основном, я хотел бы иметь карту, которая может хранить все студенты в нем (физика и химия). Студенческий билет как ключ с указателем базового класса на физику или химию. студент есть, я есть угадай, куда идти.
Я попробовал следующий код:
map<int,student*> allstudents;
physics S1(sName,sID);
physics* S2 = &S1;
allstudents.insert(pair<int,student*>(sID,S2));
Но это не сработало. Я думаю, что немного путаюсь в том, что должно указывать на что. Вы можете даже сделать это с картами? Должно ли также быть какое-либо "очищение", необходимое, если я сохраняю информацию. - сюда? Спасибо за вашу помощь.
2 ответа:
Если вы используете указатель больше секунды, вы не должны создавать объект в стеке, а затем указывать на него! Он исчезнет, как только появится следующий
}
, и ваш указатель будет недействительным!Вместо этого используйте
physics* S2 = new physics(sName, sID);
. Используйтеdelete
на всех указателях в вашей карте (итератор пригодится здесь), чтобы очистить!
Вы можете, но вы упускаете пару вещей:
Вы не соблюдаетеправило трех . Вам также необходимо определить оператор присваивания и конструктор копирования в ваших классах.
Возможно, вы столкнулись с проблемами повреждения памяти:
Следующие
physics S1(sName,sID); physics* S2 = &S1; allstudents.insert(pair<int,student*>(sID,S2));
Вставит указатель, который будет болтаться, когда
S1
выйдет из области видимости. Вы должны либо использовать интеллектуальный указатель, либо делегировать управление памятью map-то есть создайте свой объект сnew
иdelete
, когда карта выходит из области видимости.