![](/img/trans.png)
[英]Dynamic Array Template Class: problem with ostream& operator friend function
[英]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.