从C+中删除对象+;列表 我是C++的新手…我在上几节课,一节给学生,一节给课程。课程中有一个添加学生对象的“列表”
我可以添加一个学生:从C+中删除对象+;列表 我是C++的新手…我在上几节课,一节给学生,一节给课程。课程中有一个添加学生对象的“列表”,c++,list,C++,List,我可以添加一个学生: void Course::addStudent(Student student) { classList.push_back(student); } 但是当我去删除一个学生时,我不能删除它。我得到一个关于Student not derived和操作符==(const分配器)的长错误 有什么建议吗? 谢谢 我指的是这个网站,了解如何添加/删除元素: 学生代码: class Student { std::string name; int id; public:
void Course::addStudent(Student student)
{
classList.push_back(student);
}
但是当我去删除一个学生时,我不能删除它。我得到一个关于Student not derived和操作符==(const分配器)的长错误
有什么建议吗?
谢谢
我指的是这个网站,了解如何添加/删除元素:
学生代码:
class Student {
std::string name;
int id;
public:
void setValues(std::string, int);
std::string getName();
};
void Student::setValues(std::string n, int i)
{
name = n;
id = i;
};
std::string Student::getName()
{
return name;
}
完整课程代码:
class Course
{
std::string title;
std::list<Student> classList; //This is a List that students can be added to.
std::list<Student>::iterator it;
public:
void setValues(std::string);
void addStudent(Student student);
void dropStudent(Student student);
void printRoster();
};
void Course::setValues(std::string t)
{
title = t;
};
void Course::addStudent(Student student)
{
classList.push_back(student);
}
void Course::dropStudent(Student student)
{
classList.remove(student);
}
void Course::printRoster()
{
for (it=roster.begin(); it!=roster.end(); ++it)
{
std::cout << (*it).getName() << " ";
}
}
课程
{
std::字符串标题;
std::list classList;//这是一个学生可以添加到的列表。
std::list::迭代器;
公众:
void设置值(std::string);
无效的学生(学生);
无效辍学学生(学生);
作废打印花名册();
};
无效课程::设置值(标准::字符串t)
{
title=t;
};
无效课程::添加学生(学生)
{
班级列表。推回(学生);
}
无效课程::dropStudent(学生)
{
类列表。删除(学生);
}
无效课程::打印花名册()
{
for(it=floster.begin();it!=floster.end();+it)
{
std::cout删除列表中与您给定的元素相比较的所有元素。您没有给出Student
的定义,但可能没有定义操作符==()
方法,因此调用remove()
无法工作。列表无法删除您的学生,因为它不知道如何将列表中的学生与删除方法中的学生进行比较。
请注意,student是按值传递的,因此它与列表中的实例不同
您可以做的一件事是在Student
中实现一个操作符==
,它将帮助列表找到您的学生
另一种可能性(特别是当您无法更改学生
课程时)是持有学生*
(学生指针)列表,然后列表将能够比较指针,并找到您试图删除的指针。问题是,正如所指出的,Student
缺少std::list::remove
所需的运算符==
#include <string>
class Student {
std::string name;
int id;
public:
bool operator == (const Student& s) const { return name == s.name && id == s.id; }
bool operator != (const Student& s) const { return !operator==(s); }
void setValues(std::string, int);
std::string getName();
Student() : id(0) {}
};
#包括
班级学生{
std::字符串名;
int-id;
公众:
布尔运算符==(const Student&s)const{return name==s.name&&id==s.id;}
布尔运算符!=(常量Student&s)常量{return!运算符==(s);}
void设置值(std::string,int);
std::string getName();
Student():id(0){}
};
请注意操作符==
和操作符!=
是如何重载的。如果两个对象可以与==
进行比较,那么!=
也应该可以使用。检查操作符!=
是如何按照操作符==
编写的
还要注意,参数作为常量引用传递,函数本身是const
实例:无效课程::dropStudent(学生学生)
{
list::iterator itr=classList.begin();
临时名单;
while(itr!=classList.end())
{
如果(itr->id!=学生id)
{
临时性。推回(itr);
}
itr++;
}
类列表=临时;
}
我们需要更多详细信息。我们甚至不知道对象类列表是什么类型,或者删除函数是什么样子。很抱歉,我已经编辑了我的文档。希望它更清晰。请发布准确的错误消息——不要描述它们。我们还需要查看学生
包含的内容。如果classList
是一个std::list
,那么remove()
要求Student
需要一个相等运算符(operator=
)通过常量引用传递这些学生和字符串,或者您多次复制它们。我是否应该使用运算符==()
然后在我的remove(compare())中调用该方法?可以,但可以在类中定义一个方法来比较两个Student
类-bool Student::operator==(Student&)
然后决定是什么让两个学生在这方面平等basis@user3281388list::remove
将使用=
来比较两个对象。它不知道任何事情,也不会使用compare()
函数做任何事情。如果要编写compare()
函数供您自己或其他函数使用,那就不同了。最好创建一个单独的操作符==
方法,还是可以将它放在我的remove方法中?操作符==
应该是Student
类的一部分。但通常它是在类之外实现的。c见鬼链接。感谢你的思考Arnon,这帮助我理解了发生的事情!非常感谢Paul!这很有效!我开始着手添加一个操作符,但后来看到了你的评论。我很接近,但不是很清楚。我真的很感谢你的帮助!谢谢你!谢谢你的答案,你能编辑你的答案来详细说明一下吗?我艾克,op做错了什么,你是如何修复的!
#include <string>
class Student {
std::string name;
int id;
public:
bool operator == (const Student& s) const { return name == s.name && id == s.id; }
bool operator != (const Student& s) const { return !operator==(s); }
void setValues(std::string, int);
std::string getName();
Student() : id(0) {}
};
void Course::dropStudent(Student student)
{
list<Student>::iterator itr=classList.begin();
list<Student>temporary;
while(itr!=classList.end())
{
if(itr->id!=student.id)
{
temporary.push_back(itr);
}
itr++;
}
classList=temporary;
}