Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在循环中创建对象并将其添加到向量时,始终会添加相同的对象_C++ - Fatal编程技术网

C++ 在循环中创建对象并将其添加到向量时,始终会添加相同的对象

C++ 在循环中创建对象并将其添加到向量时,始终会添加相同的对象,c++,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>

我有个问题

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();
}
而不是

a,b,c,d

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

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

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

    if (myFile >> a >> c) {
         // carry on
    }
    else {
        std::cout << "ERROR: failed to read record!\n";
        // recover, bail out, ...
    }
    
    物体会很方便地自行清理。也就是说,快速摆脱
    DisposeObject()
    成员函数!C++使用析构函数,并且整洁地执行它,因为它不是垃圾收集。不要试图将C#习语带到C++中:这对你没有任何好处

  • 不需要从向量中单独删除每个对象。只需使用
    clear()


  • 如果向量不包含指针,为什么要使用new?你能给出一个完整的例子吗?你确定你在每次迭代中都从
    myFile
    读取不同的信息吗?如果向量中有四个
    student
    实例,则意味着
    push_-back
    s工作,但与对象一起存储的信息不正确。还有,你为什么要
    new
    这个学生?你可以很容易地把你推回去,省去清理:
    sList.push_back(学生(i,a,班级))
    另外,是否
    DisposeObject()
    commit succide,即是否
    删除此
    ?否则,每一个
    学生
    你的
    都有漏洞。(注意:我不建议自杀!)@user3106529你调试过你的代码吗?顺便说一句,
    删除s1
    在哪里?sList存储的是什么,s还是*s?以及
    学生
    复制
    课程
    ?如果您只是在
    for(int i…
    循环中声明
    向量类
    ,每次迭代都会得到一个新的类。您的
    while()pop
    循环似乎不必要或错误。我要补充的是
    void DisposeObject(){delete this;}
    是一个非常糟糕的主意。“正确处理”必须遵守的限制相当繁重:
    if (myFile >> a >> c) {
         // carry on
    }
    else {
        std::cout << "ERROR: failed to read record!\n";
        // recover, bail out, ...
    }
    
    sList.push_back(student(i, a, classes));
    
    classes.clear();