std ::基类指针的映射

时间:2012-04-15 09:59:57

标签: c++ pointers map base-class

我正在编写代码来存储不同程度的考试成绩(当前物理和化学)。

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

但这不起作用。我觉得我对应该指出什么感到困惑。你甚至可以用地图做到这一点吗? 如果我存储信息,是否还需要“清理”。这条路? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

你可以,但你遗漏了几件事:

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

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

以下

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

将插入一个变为悬空的指针。您应该使用智能指针或将内存管理委派给地图 - 例如,当地图超出范围时,使用newdelete创建对象。

答案 1 :(得分:3)

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

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