gpt4 book ai didi

c++ - 重载 << 运算符以打印 vector 内容

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:04 25 4
gpt4 key购买 nike

我查找了有关重载 << 运算符的信息,似乎我做的一切都是正确的,但我一直收到编译错误。我在我的头文件中加入了这个函数,并在我的 cpp 文件的顶部放置了一个原型(prototype)。

我的大学.h:

#ifndef UNIVERSITY_H
#define UNIVERSITY_H

#include <string>
#include <vector>
#include <iostream>

using namespace std;

#include "Department.h"
#include "Student.h"
#include "Course.h"
#include "Faculty.h"
#include "Person.h"


class University
{
friend ostream& operator<< (ostream& os, const vector<Department>& D);
friend ostream& operator<< (ostream& os, const Department& department);

protected:
vector<Department> Departments;
vector<Student> Students;
vector<Course> Courses;
vector<Faculty> Faculties;
static bool failure;
static bool success;


public:

bool CreateNewDepartment(string dName, string dLocation, long dChairID);
bool ValidFaculty(long dChairID);
};

#endif

我的大学.cpp:

#ifndef UNIVERSITY_CPP
#define UNIVERSITY_CPP

#include<string>
#include<vector>
#include<iostream>
using namespace std;

#include "University.h"

ostream& operator<<(ostream& os, const vector<Department>& D);
ostream& operator<<(ostream& os, const Department& department);

bool University::failure = false;
bool University::success = true;


bool University::CreateNewDepartment(string dName, string dLocation, long dChairID)
{
if((dChairID != 0) && (ValidFaculty(dChairID)== University::failure))
{
Department D(dName, dLocation, dChairID);
Departments.push_back(D);
for (int i = 0; i < Departments.size(); i++)
cout << Departments;
return University::success;
}
return University::failure;
}

bool University::ValidFaculty(long dChairID)
{
for (int i = 0; i < Faculties.size(); i++)
{
if (Faculties[i].ID == dChairID)
return University::success;
}
return University::failure;
}

ostream& operator<<(ostream& os, const vector<Department>& D)
{
for (int i = 0; i < D.size(); i++)
os << D[i] << endl;
os << "\n";
return os;
}

ostream& operator<< (ostream& os, const Department& department)
{
department.Print(os);
return os;
}

#endif

我的部门.h:

#ifndef DEPARTMENT_H
#define DEPARTMENT_H

#include<vector>
#include<string>
#include<iostream>
using namespace std;

class Department
{
friend class University;
friend ostream& operator<< (ostream& os, Department& department);

protected:
long ID;
string name;
string location;
long chairID;
static long nextDepartID;

public:
Department();
Department(string dName, string dLocation, long dChairID);
void Get();
void Print(ostream& os)const;
};

#endif

我的部门.cpp:

#ifndef DEPARTMENT_CPP
#define DEPARTMENT_CPP

#include<iostream>
#include<string>
using namespace std;

#include "Department.h"

long Department::nextDepartID = 100;

Department::Department()
{
ID = nextDepartID++;
name = "Null";
location = "Null";
chairID = 0;
}

Department::Department(string dName, string dLocation, long dChairID):name(dName), location(dLocation), chairID(dChairID)
{
ID = nextDepartID++;
}

void Department::Get()
{
}

void Department::Print(ostream& os)const
{
os << "\n";
os << ID << endl;
os << name << endl;
os << location << endl;
os << chairID << endl;
os <<"\n\n";
}

ostream& operator<< (ostream& os, const Department& department)
{
department.Print(os);
return os;
}
#endif

现在可以看到仅属于此问题的所有内容。我现在收到的唯一错误是没有忽略 void 值。

错误片段:

University.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Department&)’:
University.cpp:53: error: void value not ignored as it ought to be
Department.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Department&)’:
Department.cpp:42: error: void value not ignored as it ought to be

最终编辑:

感谢所有帮助过我的人。我现在肯定对运算符重载有了更好的理解......尤其是当它处理用户定义类型的打印 vector 时!

最佳答案

投诉是虽然您迭代和打印 vector 内容的函数可能是正确的,但 vector 包含的实际对象没有 operator<<指定。

你需要有一个。

如果您已经有一个名为 Print() 的方法在你的Department类,您可以简单地为 operator<< 创建一个重载如下:

std::ostream& operator<<(std::ostream& os, const Department& department) {
os<<department.Print();
return os;
}

在您发布更新之前,我已经准备了以下代码。也许它可以帮助你。

#include<iostream>
#include<vector>
#include<string>

class Department {
public:
Department(const std::string& name)
: m_name(name) { }
std::string name() const {
return m_name;
}
private:
std::string m_name;
};


// If you were to comment this function, you would receive the
// complaint that there is no operator<< defined.
std::ostream& operator<<(std::ostream& os, const Department& department) {
os<<"Department(\""<<department.name()<<"\")";
return os;
}

// This is a simple implementation of a method that will print the
// contents of a vector of arbitrary type (not only vectors, actually:
// any container that supports the range-based iteration): it requires
// C++11.
template<typename T>
void show(const T& container) {
for(const auto& item : container) {
std::cout<<item<<std::endl;
}
}

int main() {
std::vector<Department> deps = {{"Health"}, {"Defense"}, {"Education"}};
show(deps);
}

g++ example.cpp -std=c++11 -Wall -Wextra 编译(我使用 OS X 10.7.4 和 GCC 4.8.1)得到:

$ ./a.out 
Department("Health")
Department("Defense")
Department("Education")

关于c++ - 重载 << 运算符以打印 vector 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com