簡體   English   中英

定義ostream運算符的Friend函數

[英]Friend function defining an ostream operator

我想定義一個ostream運算符,以方便我輸出alglib::complex類型的變量。 為了提供一個不包含alglib庫的有效示例,我將在下面重載complex<double>的輸出(此澄清是由於問題的早期版本)。 在頭文件“ my_class.h”中,我有

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

class my_class {

    public:

    ostream& operator << (std::ostream& os, complex<double> a) {
        os << "(" << real(a) << "," << imag(a) << ")";
        return os;
    }

    void output(complex<double>);

    my_class() {}
    ~my_class() {}
};

在源文件“ my_class.cpp”中,

#include "my_class.h"

void my_class::output(complex<double> cd) {
    cout << cd << endl;
}

最后,我有一個主要的方法文件“ run_my_class.cpp”:

#include "my_class.h"

int main(int argc, const char* argv[]) {

    my_class obj;
    complex<double> cd=complex<double>(1.0,-1.0);
    obj.output(cd);

}

我嘗試使用編譯

g++ -c my_class.cpp

但這給了我錯誤

my_class.h:9:62: error: ‘std::ostream& my_class::operator<<(std::ostream&, std::complex<double>)’ must take exactly one argument
 ostream& operator << (std::ostream& os, complex<double> a) {

但是,如果我將運算符定義為朋友,即friend ostream& operator << (std::ostream& os, complex<double> a) ,它將編譯並編譯main方法:

g++ run_my_class.cpp my_class.o -o run_my_class

它可以正常工作。 但是,這似乎不是friend關鍵字的用途。 有沒有更好的方法可以使這項工作?

由於operator <<將在std::ostream上調用,因此您不能將此過程定義為my_class成員函數my_class必須將其定義為全局函數 ,因為它是std::ostream的操作,而不是my_class

通過將friend關鍵字放入聲明中,意味着您要聲明operator <<作為朋友全局函數 (而不是成員函數!)。 C ++標准允許您在其中放置friend函數的定義,但它不會成為成員函數。 它與以下內容相同,但更清楚:

#include <complex>
#include <iostream>

class my_class {

public:

    friend ostream& operator << (std::ostream& os, complex<double> a);

    void output(complex<double>);

    my_class() {}
    ~my_class() {}
};

std::ostream& operator << (std::ostream& os, complex<double> a) {
    os << "(" << real(a) << "," << imag(a) << ")";
    return os;
}

正如評論中已經指出的那樣,在這里不需要使用friend

與問題無關,但是請注意,解析頭文件中的名稱空間通常是一個真正的壞主意,因為包括它在內的所有其他文件也會隱式地解析該名稱空間。 從長遠來看,它很容易導致令人討厭的編譯錯誤。

我不會稱其為更好的方法,而是更清晰的方法。

這又是您的流運算符:

ostream& operator << (std::ostream& os, complex<double> a) {
        os << "(" << real(a) << "," << imag(a) << ")";
        return os;
}

它的第一個參數是輸出流。 由於您無權訪問輸出流,因此除非將其設為該類的朋友,否則不能將輸出流運算符用作成員函數。

如果要避免使用friend ,則可以始終將其定義為類外部的函數,這是最常見的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM