c++ - 定义 ostream 运算符的友元函数

标签 c++ class operators friend ostream

我想定义一个 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 ,即friend ostream& operator << (std::ostream& os, complex<double> a) ,它编译,我编译主要方法:

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

它按预期工作。然而,这并不是friend 看起来的样子。关键字是为了。有没有更好的方法来完成这项工作?

最佳答案

operator <<将在 std::ostream 上调用, 您不能将此过程定义为 my_class成员函数 ,您必须将其定义为全局函数,因为它是针对 std::ostream 的操作, 不是 my_class .

通过输入 friend声明中的关键字,你是说你想声明 operator <<作为 friend 全局函数(不是成员函数!)。 C++ 标准允许您将友元函数的定义放在那里,但它不会是成员函数。和下面一样,更清楚:

#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 的用法这里没有必要。

与问题无关,但请注意,在头文件中解析命名空间通常是一个非常非常糟糕的主意,因为包括它在内的所有其他文件也会隐式解析该命名空间。从长远来看,它很容易导致令人烦恼的编译错误。

关于c++ - 定义 ostream 运算符的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33064649/

相关文章:

c++ - Xlib 这个(去掉窗饰)是怎么工作的?

java - 获取泛型类型或泛型实例的类

c++ - 重载操作符 << 时出错

c# - .NET,Equal() 只是 == 吗?

java - java中的一元运算符优先级

c++ - 关于C++虚拟继承的问题

c++ - Pro*C 代码处理解决ORA-01405 : fetched column value is NULL

c++ - 如何只链接到 Conan 包中的某些库?

java - 使用继承时如何创建对象?

c - ~ C 中的运算符