web-dev-qa-db-ja.com

ヘッダーファイルとcppファイルでのオペレーターのオーバーロード

オペレーターをオーバーロードしようとすると、エラーが発生しました。

私のヘッダーファイル:

#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ファイルで、オーバーロードされた演算子<<を定義するときに、エラーが発生しました。どうして?

7
B.J

オペレーターはクラスのメンバーではなく、友達なので

 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で強制的に再コンパイルする必要があります。

9
Strong will

ヘッダーファイルで、クラスのフレンドメソッドを宣言しました

friend ostream& operator<<(ostream& output, const Hallgato& H);

このメソッドは、Hallgato::なしで(cppで)定義する必要があります

ostream& operator<<(ostream& output, const Hallgato& H)

このメソッドはハルガトクラスの一部ではないためです。

1
james