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 2

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, когда карта выходит из области видимости.