朋友功能的范围

mat*_*ker 0 c++ g++ friend

我有两个类,一个两个,每个都有一个朋友成员函数,指向另一个.第一个头文件如下:

#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H

class two;

class one {

private:
int one_data;

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

#endif
Run Code Online (Sandbox Code Playgroud)

第二个头文件如下所示:

#ifndef SECONDCLASS_H
#define SECONDCLASS_H

class one;

class two {

private:
int two_data;

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

#endif
Run Code Online (Sandbox Code Playgroud)

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

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

void two::first_data (one * class1) {

}

 void one::second_data (two * class2) {

}
Run Code Online (Sandbox Code Playgroud)

错误如下:

 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’
Run Code Online (Sandbox Code Playgroud)

当我在函数名称之前删除类限定符时,代码将编译.修改后的功能如下:

 void first_data(one * class1) {

 }

 void second_data(two * class2) {

 }
Run Code Online (Sandbox Code Playgroud)

我是c ++的新手,我不确定在第一种情况下我是否做错了什么.请赐教.

Alo*_*ave 5

你宣布的是作为你班级的朋友的独立功能.
他们不是任何阶级的真正成员.

friend void first_data (one *); 
Run Code Online (Sandbox Code Playgroud)

宣布一个独立的功能first_data作为你班级的朋友,它并不意味着first_data你的班级的成员功能.因此,当您在cpp文件中定义函数时,编译器会抱怨该函数从未声明过.

也,

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

Returntype ClassName ScopeResolution FunctionSignature
Run Code Online (Sandbox Code Playgroud)

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