2

我正在编写代码来存储不同学位的考试结果(目前是物理和化学)。

我有一个抽象基类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));

但这没有用。我想我对应该指向什么有点困惑。你甚至可以用地图做到这一点吗?如果我存储信息,是否还需要任何“清理”。这边走?谢谢你的帮助。

4

2 回答 2

3

你可以,但你错过了几件事:

  • 你不尊重三法则。您还需要在类中定义赋值运算符和复制构造函数。

  • 您可能会遇到内存损坏问题:

以下

physics S1(sName,sID);
physics* S2 = &S1;
allstudents.insert(pair<int,student*>(sID,S2));

将插入一个指针,当S1超出范围时会变得悬空。您应该使用智能指针或将内存管理委托给映射 - 即在映射超出范围时使用它new创建对象。delete

于 2012-04-15T10:03:42.647 回答
3

如果您使用指针超过一秒钟,您不应该在堆栈上创建对象然后指向它!下一个一出现就消失}了,你的指针就失效了!

改为使用physics* S2 = new physics(sName, sID);。使用delete地图中的所有指针(迭代器在这里很方便)进行清理!

于 2012-04-15T10:04:15.233 回答