头文件和 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 文件中,当我想定义重载运算符 &lt;&lt; 时,出现错误。为什么?

【问题讨论】:

嗨,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 ++ = +=

将代码拆分为头文件和主代码

对运算符重载和友元函数的例子

c++ 运算符重载问题

我想在cpp中实现python列表,但卡在重载下标运算符[]和逗号,[关闭]

刚接触 c++ 和重载运算符,不确定如何使用该函数