我有一个问题,
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
顺便说一下,我已经尝试过保留功能。
最佳答案
代码不足以准确指出问题所在。然而,有很多事情至少是可疑的:
您不检查任何输入,只是假设一切顺利!我个人的猜测是在第一条记录的末尾或第二条记录的开头读取失败,您只是重复使用已经读取的值。您总是想在尝试阅读之后检查您的阅读,例如:
if (myFile >> a >> c) { // carry on } else { std::cout << "ERROR: failed to read record!\n"; // recover, bail out, ... }
在 C++ 中,您不要在堆上分配对象,除非绝对必要!大多数时候,您可以通过一些类为您进行分配而逃脱。我不记得上次在应用程序代码中使用
new
是什么时候了。以下是如何附加student
记录:sList.push_back(student(i, a, classes));
该对象会很方便地自行清理。也就是说,快速摆脱您的
DisposeObject()
成员函数! C++ 使用析构函数并巧妙地这样做,因为它不是垃圾收集器。不要试图将 C# 习语移植到 C++:这对你没有任何好处。无需从 vector 中逐个删除每个对象。只需使用
clear()
:classes.clear();
关于c++ - 在循环中创建对象并将其添加到 vector 时,总是添加相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606238/