C++ 友元函数的范围

C++ 友元函数的范围,c++,g++,friend,C++,G++,Friend,我有两个类,one和two,每个类都有一个friend成员函数,并带有指向另一个类的指针。第一个头文件如下所示: #ifndef FIRSTCLASS_H #define FIRSTCLASS_H class two; class one { private: int one_data; public: friend void second_data (two *); }; #endif 第二个头文件如下所示: #ifndef SECONDCLASS_H #define SECOND

我有两个类,onetwo,每个类都有一个friend成员函数,并带有指向另一个类的指针。第一个头文件如下所示:

#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H

class two;

class one {

private:
int one_data;

public:
friend void second_data (two *);
};

#endif
第二个头文件如下所示:

#ifndef SECONDCLASS_H
#define SECONDCLASS_H

class one;

class two {

private:
int two_data;

public:
friend void first_data (one *);
};

#endif
实际函数位于第三个.cpp文件中。我用适当的类限定符编写了函数,它给出了一个编译错误。我使用的是g++。功能如下:

#include "firstclass.h"
#include "secondclass.h"

void two::first_data (one * class1) {

}

 void one::second_data (two * class2) {

}
 void first_data(one * class1) {

 }

 void second_data(two * class2) {

 }
错误如下:

 error:no ‘void two::first_data (one*)’ member function declared in class ‘two’ 
 error: no ‘void one::second_data(two*)’ member function declared in class ‘one’
当我将类限定符放在函数名之前时,代码将编译。修改后的功能如下:

#include "firstclass.h"
#include "secondclass.h"

void two::first_data (one * class1) {

}

 void one::second_data (two * class2) {

}
 void first_data(one * class1) {

 }

 void second_data(two * class2) {

 }

<>我是C++新手,我不确定我是否在第一个案例中做了什么错事。请告诉我。

您声明的是作为类的朋友的独立函数。
他们实际上不是任何阶级的成员

friend void first_data (one *); 
声明一个独立函数
first_data
作为类的朋友,并不意味着
first_data
是类的成员函数。因此,当您在cpp文件中定义函数时,编译器会抱怨从未声明过该函数

而且

void two::first_data (one * class1){}

Returntype ClassName ScopeResolution FunctionSignature

two::
告诉编译器函数属于这个特定的类,它不是名称空间规范,而是类限定。

那不是
名称空间
,而是
限定符

void two::first_data (one * class1) {

}
从类
two
定义方法
first\u data

但是,您将自由函数
first\u data
声明为friend:

friend void first_data (one *);
这是不一样的。如果您想要免费函数作为好友,请使用您已有的
friend
声明。如果不是,则可以类似地将方法声明为好友:

friend void two::first_data (one *);

对不起,我的意思是班级资格。我应该编辑这个问题,但是第一个数据()确实是第二类的成员。那么,two::first_data(one*)是否应该编译?@mathematicshelp-seek不,您没有声明成员为好友,而是声明自由函数。@mathematicshelp-seek您没有错,但它没有按照您的想法执行。它将免费函数
second\u data
声明为朋友,而不是
one
@mathematics求助者的成员
second\u data
。为此,您需要
friend void one::second\u data(两个*)
。我想我理解我的错误(以及您想说的:)