我有两个类,一个和两个,每个类都有一个朋友成员函数,指向另一个。第一个头文件如下:
#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) {
}
错误如下:
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’
当我在函数名之前删除类限定符时,代码会编译。修改后的功能如下:
void first_data(one * class1) {
}
void second_data(two * class2) {
}
我是c ++的新手,我不确定在第一种情况下我做错了什么。请赐教。
答案 0 :(得分:5)
您宣布的是作为您班级的朋友的独立职能 他们不是任何阶级的真正成员。
friend void first_data (one *);
声明一个独立的函数first_data
作为你班级的朋友,这并不意味着first_data
是你班级的成员函数。因此,当您在cpp文件中定义函数时,编译器会抱怨该函数从未声明过。
另外,
void two::first_data (one * class1){}
Returntype ClassName ScopeResolution FunctionSignature
two::
告诉编译器函数属于这个特定的类,它不是命名空间规范,而是类限定。
答案 1 :(得分:2)
这不是namespace
,这是class
限定符。
void two::first_data (one * class1) {
}
定义来自班级first_data
的方法two
。
但是,您将自由函数first_data
声明为朋友:
friend void first_data (one *);
这是不一样的。如果您想将免费功能作为朋友,请使用您已有的friend
声明。如果没有,您可以将方法声明为类似的朋友:
friend void two::first_data (one *);