运算符在头文件和cpp文件中重载

时间:2017-11-02 19:37:25

标签: c++ operator-overloading overloading

当我试图重载操作符时,我收到了错误。

我的标题文件:

#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文件中,当我想定义重载的运算符<<时,我收到了一个错误。为什么呢?

2 个答案:

答案 0 :(得分:4)

运营商不是班级成员,而是朋友

 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中。

答案 1 :(得分:0)

在头文件中,您声明了类

的友方方法
friend ostream& operator<<(ostream& output, const Hallgato& H);

这个方法应该在没有Hallgato::

的情况下定义(在cpp中)
ostream& operator<<(ostream& output, const Hallgato& H)

因为此方法不属于Hallgato类。