c++ - 在循环中创建对象并将其添加到 vector 时,总是添加相同的对象

标签 c++

我有一个问题,

class student {
public:
    static int id,a,c;
    static bool editable;
    static std::queue <int> classes;
    static queue <int> classesT;
    static queue <int> classesD;
public:
    student(int x,int y,queue <int> z){
        editable=true;
        id=x;
        a=y;
        classes=z;
        c=classes.size();
    }

    void DisposeObject()
    {
       delete this;
    }
};

int main(){
std::vector <queue <int> >links;
std::vector <int> quotas;
std::vector <student> sList;
std::queue <int> classes;
std::queue <student> q1;
int a,c,sNum,cNum;
static int temp;
ifstream myFile("....");
if(myFile.is_open()){
    myFile>>sNum;
    myFile>>cNum;
}
for(int i=0;i<sNum;i++){
    myFile>>c;
    myFile>>a;
    for(int j=0;j<c;j++){
    myFile>>temp;
    classes.push(temp);
    }
    student *s1=new student(i,a,classes);
    sList.push_back(*s1);
    s1->DisposeObject();
    while(!classes.empty())
        classes.pop();
}

这是我的代码。我想向我的 vector 中添加不同的对象,但是每当一个新学生创建了在获取其值之前创建的学生,我最终得到一个类似这样的 vector :

a,a,a,a

代替

a,b,c,d

顺便说一下,我已经尝试过保留功能。

最佳答案

代码不足以准确指出问题所在。然而,有很多事情至少是可疑的:

  1. 您不检查任何输入,只是假设一切顺利!我个人的猜测是在第一条记录的末尾或第二条记录的开头读取失败,您只是重复使用已经读取的值。您总是想在尝试阅读之后检查您的阅读,例如:

    if (myFile >> a >> c) {
         // carry on
    }
    else {
        std::cout << "ERROR: failed to read record!\n";
        // recover, bail out, ...
    }
    
  2. 在 C++ 中,您不要在堆上分配对象,除非绝对必要!大多数时候,您可以通过一些类为您进行分配而逃脱。我不记得上次在应用程序代码中使用 new 是什么时候了。以下是如何附加 student 记录:

    sList.push_back(student(i, a, classes));
    

    该对象会很方便地自行清理。也就是说,快速摆脱您的 DisposeObject() 成员函数! C++ 使用析构函数并巧妙地这样做,因为它不是垃圾收集器。不要试图将 C# 习语移植到 C++:这对你没有任何好处。

  3. 无需从 vector 中逐个删除每个对象。只需使用 clear():

    classes.clear();
    

关于c++ - 在循环中创建对象并将其添加到 vector 时,总是添加相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606238/

相关文章:

c++ - 是否有 WinAPI 函数 'ExistFile' ?

c++ - 就 ABI 兼容性而言,静态库的行为是否与动态库类似?

c++ - 如何模拟时间的流逝来调试程序?

c++ - wxwidgets自定义事件传递字符串数据完整示例

c++ - OpenGL 链式平移/旋转

c++ - 为什么构造函数需要完全按照类命名?

c++ - CMake:如何检查是否已定义某些标志

c++ - 使用 VS 2010 编译时出现模板重新定义错误

c++ - c或c++中的静态 block 是什么?

c++ - const char* 类名::getname() const ? first const 关键字的含义是什么?