Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++_Class_Pointers_Set - Fatal编程技术网

C++ 如何从C+;中的一组对象指针打印+;?

C++ 如何从C+;中的一组对象指针打印+;?,c++,class,pointers,set,C++,Class,Pointers,Set,我有一个班级的学生,我存储在我的cpp文件设置。我遇到的问题是打印出实际的学生对象。我已经尝试了所有我能想到的,我得到的不是指针的地址就是编译错误。在我的学生课上,我有一个叫做display的方法,它以我想要的格式打印出所有信息 这是我到目前为止所拥有的 .cpp文件 #include "Name.h" #include "Student.h" #include<iostream> #include<string> #include<set> using na

我有一个班级的学生,我存储在我的cpp文件设置。我遇到的问题是打印出实际的学生对象。我已经尝试了所有我能想到的,我得到的不是指针的地址就是编译错误。在我的学生课上,我有一个叫做display的方法,它以我想要的格式打印出所有信息

这是我到目前为止所拥有的

.cpp文件

#include "Name.h"
#include "Student.h"
#include<iostream>
#include<string>
#include<set>
using namespace std;

int main()
{
    Student s1;
    set<Student *> s;
    while(cin>>s1)
    {
        s.insert(new Student(s1));
    }
    for(set<Student *>::const_iterator it = s.begin(); it != s.end(); ++it)
    {
        &(*it).display(cout);
    }
}
文件是这样组织的。首先是学生的id,然后是他们的名字,然后是他们修过的课程数量,然后是课程数量加上他们在该课程中获得的分数


我的问题是如何打印实际的学生对象?

for
循环中:

for(set<Student *>::const_iterator it = s.begin(); it != s.end(); ++it)
{
    &(*it).display(cout);
}

for
循环中:

for(set<Student *>::const_iterator it = s.begin(); it != s.end(); ++it)
{
    &(*it).display(cout);
}

迭代器的行为类似于指向实际集合元素的指针,因此取消对迭代器的引用将为您提供集合元素。该元素本身就是指向
Student
对象的指针。因此,您需要取消引用两次:

(**it).display(cout);
哪一个写得更好:

(*it)->display(cout);

更好的方法是,以与code>类似的方式重载
运算符,您可以编写:

cout << (**it);

cout迭代器的行为类似于指向实际set元素的指针,因此取消对迭代器的引用将为您提供set元素。该元素本身就是指向
Student
对象的指针。因此,您需要取消引用两次:

(**it).display(cout);
哪一个写得更好:

(*it)->display(cout);

更好的方法是,以与code>
类似的方式重载
运算符,您可以编写:

cout << (**it);
cout
使用它:

#include <set>
#include <algorithm>
#include <iterator>

int main()
{
    std::set<Student> students;

    students.insert(Student("Alan"));
    students.insert(Student("Rudy"));

    std::copy(students.begin(), students.end(),
              std::ostream_iterator<Student>(std::cout, ", "));

    return 0;
}
使用它:

#include <set>
#include <algorithm>
#include <iterator>

int main()
{
    std::set<Student> students;

    students.insert(Student("Alan"));
    students.insert(Student("Rudy"));

    std::copy(students.begin(), students.end(),
              std::ostream_iterator<Student>(std::cout, ", "));

    return 0;
}

请注意,您的代码会泄漏内存。每当您发现自己在使用指针或
new
,您都应该非常非常担心,并确保您了解为什么要这样做以及为什么做得不好。您的权利,我忘了我需要释放内存。你能存储
Student
s而不是
Student
s的指针吗?然后,您可以使用
std::ostream\u迭代器(std::cout)
打印它们。请注意,您的代码会泄漏内存。每当您发现自己在使用指针或
new
,您应该非常非常担心,并三倍确保您理解为什么要这样做以及为什么没有做得更好。您的权利,我忘了我需要释放内存。你能存储
Student
s而不是
Student
s的指针吗?然后您可以使用
std::ostream\u迭代器(std::cout)
将它们全部打印出来
#include <set>
#include <algorithm>
#include <iterator>

int main()
{
    std::set<Student> students;

    students.insert(Student("Alan"));
    students.insert(Student("Rudy"));

    std::copy(students.begin(), students.end(),
              std::ostream_iterator<Student>(std::cout, ", "));

    return 0;
}
Alan, Rudy,