0

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

#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++ 新手,我不确定在第一种情况下我是否做错了什么。请赐教。

4

2 回答 2

5

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

friend void first_data (one *); 

将独立函数声明first_data为您的类的朋友,这并不意味着它first_data是您的类的成员函数。因此,当您在 cpp 文件中定义函数时,编译器会抱怨该函数从未被声明过。

还,

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

Returntype ClassName ScopeResolution FunctionSignature

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

于 2012-10-01T12:35:14.950 回答
2

那不是namespace, 那是class限定词。

void two::first_data (one * class1) {

}

定义first_data类中的方法two

但是,您将 free 函数声明为friend first_data

friend void first_data (one *);

这是不一样的。如果您想要免费函数作为朋友,请使用friend您已有的声明。如果没有,您可以将方法声明为类似的朋友:

friend void two::first_data (one *);
于 2012-10-01T12:36:07.130 回答