我正在编写代码来存储不同程度的考试成绩(当前物理和化学)。
我有一个抽象基类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
}
};
在我的主要内容中,我希望有一张地图可以存储其中的所有学生(物理和化学)。学生ID作为键,具有指向物理或化学的基类指针。我猜,学生应该走的路。
我尝试了以下代码:
map<int,student*> allstudents;
physics S1(sName,sID);
physics* S2 = &S1;
allstudents.insert(pair<int,student*>(sID,S2));
但这不起作用。我觉得我对应该指出什么感到困惑。你甚至可以用地图做到这一点吗? 如果我存储信息,是否还需要“清理”。这条路? 谢谢你的帮助。
答案 0 :(得分:3)
你可以,但你遗漏了几件事:
你不尊重三条规则。您还需要在类中定义赋值运算符和复制构造函数。
您可能遇到内存损坏问题:
以下
physics S1(sName,sID);
physics* S2 = &S1;
allstudents.insert(pair<int,student*>(sID,S2));
当S1
超出范围时,将插入一个变为悬空的指针。您应该使用智能指针或将内存管理委派给地图 - 例如,当地图超出范围时,使用new
和delete
创建对象。
答案 1 :(得分:3)
如果你使用指针超过一秒钟,你不应该在堆栈上创建对象,然后指向它!一旦下一个}
出现,它将会消失,你的指针将无效!
请改用physics* S2 = new physics(sName, sID);
。在地图上的所有指针上使用delete
(迭代器在这里很方便)来清理!