头文件和 cpp 文件中的运算符重载
Posted
技术标签:
【中文标题】头文件和 cpp 文件中的运算符重载【英文标题】:Operator overloading in header files and in the cpp files 【发布时间】:2018-04-15 10:49:41 【问题描述】:当我尝试重载运算符时出现错误。
我的头文件:
#include<iostream>
#include<string>
using namespace std;
#ifndef HALLGATO_H
#define HALLGATO_H
class Hallgato
private:
char* nev;
char* EHA;
int h_azon;
unsigned int kepesseg;
public:
friend ostream& operator<<(ostream& output, const Hallgato& H);
;
#endif
我的 cpp 文件:
#include<iostream>
#include "Hallgato.h"
using namespace std;
ostream& Hallgato::operator<<(ostream& output, const Hallgato& H)
output << "Nev: " << H.nev << " EHA: " << H.EHA << " Azonosito: " << H.h_azon << " Kepesseg: " << H.kepesseg << endl;
return output;
;
在我的 .cpp 文件中,当我想定义重载运算符 <<
时,出现错误。为什么?
【问题讨论】:
嗨,B.J,您可以添加收到的错误消息吗? 您的文件中似乎有额外的
...
【参考方案1】:
操作员不是类的成员,所以是朋友
ostream& Hallgato::operator<<(ostream& output, const Hallgato& H)
应该是
ostream& operator<<(ostream& output, const Hallgato& H)
为了能够使用其他文件中的运算符,您应该在头文件中添加一个原型。
头文件会变成这个
hallgato.h
#ifndef HALLGATO_H
#define HALLGATO_H
#include<iostream>
#include<string>
class Hallgato
private:
char* nev;
char* EHA;
int h_azon;
unsigned int kepesseg;
public:
friend std::ostream& operator<<(std::ostream& output, const Hallgato& H);
;
std::ostream& operator<<(std::ostream& output, const Hallgato& H);
#endif /* End of HALLGATO_H */
您可以在“.cpp”文件中的某个地方实现运算符函数,您也可以在头文件中执行此操作,但是您必须经常使用某些编译器重新编译。
hallgato.cpp
#include "hallgato.h"
std::ostream& operator<<(std::ostream& output, const Hallgato& H)
/* Some operator logic here */
注意:
当您修改头文件时,许多编译器通常不会将它们重新包含在您的 .cpp
文件中。这样做是为了避免不必要的重新编译。要强制重新包含,您必须对包含这些头文件的源文件进行一些修改(删除空行)或在编译器/IDE 中强制重新编译。
【讨论】:
如果您使用的是 Dev-C++ 5.11 (Windows x64),请再次重建所有文件。花了我一个小时。【参考方案2】:在头文件中你声明了类的友元方法
friend ostream& operator<<(ostream& output, const Hallgato& H);
这个方法应该在没有Hallgato::
的情况下定义(在cpp中)
ostream& operator<<(ostream& output, const Hallgato& H)
因为这个方法不是 Hallgato 类的一部分。
【讨论】:
以上是关于头文件和 cpp 文件中的运算符重载的主要内容,如果未能解决你的问题,请参考以下文章
类模板 友元重载形式 各种运算符重载 new delete ++ = +=