Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++的新手…我在上几节课,一节给学生,一节给课程。课程中有一个添加学生对象的“列表”_C++_List - Fatal编程技术网

从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@user3281388
list::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;
}