跨多个文件的朋友功能

时间:2014-04-04 10:25:40

标签: c++ function overloading operator-keyword friend

您好我正在学习运营商重载和朋友功能。

我已宣布运营商<<在.h文件中作为我班级的朋友,但我仍然无法从.cpp文件中的函数定义访问私有成员变量

我的代码如下:

Test.h

class Test
{
private:
    int size;
public:
    friend ostream& operator<< (ostream &out, Test& test);
};

Test.cpp的

#include "Test.h"
#include <iostream>

using namespace std;

ostream& operator<< (ostream& out, Test& test)
{
    out << test.size; //member size is inaccessible!
}

显然大小是不可访问的,虽然我已经使运营商&lt;&lt;我班上的朋友。我用谷歌搜索了一下,没有找到任何东西,所以任何人都可以帮助我吗?感谢。

注意:如果我将类定义移动到.cpp文件,每个人都可以工作,所以我认为我的问题与多个文件有关。

1 个答案:

答案 0 :(得分:1)

在c ++中,声明的范围从上到下。因此,如果您首先包含Test.h,那么<iostream>之后,朋友声明就不知道类型std::ostream

解决方案:

Test.h:

#include <iostream>
class Test
{
private:
    int size;
public:
    friend std::ostream& operator<< (std::ostream &out,const Test& test);
};

Test.cpp的:

#include "Test.h"

std::ostream& operator<< (std::ostream& out,const Test& test)
{
    out << test.size;
    return (*out);
}

请注意,#include <iostream>已从Test.cpp移至Test.h,全局operator <<的参数需 const {{1} }。 const使运算符适用于rvalues