从不同标头中定义的类向函数授予友谊 首先,这不是“作业”,它是C++中第1卷第5章第5章的思考问题。 我需要创建3个类,第一个类将其内部的友谊授予整个第二个类,而友谊只授予第三个类的一个函数

从不同标头中定义的类向函数授予友谊 首先,这不是“作业”,它是C++中第1卷第5章第5章的思考问题。 我需要创建3个类,第一个类将其内部的友谊授予整个第二个类,而友谊只授予第三个类的一个函数,c++,C++,我对将友谊授予整个第二类没有问题,但是对于授予第三类函数,如果我在同一个头中声明第三类,则没有问题。但是在不同的头文件中,我得到了一些未定义的类型/声明。感谢您的帮助,以下是代码: #ifndef FIRSTCLASS_H #define FIRSTCLASS_H //firstclasss header file #include "secondclass.h" #include "thirdclass.h" class secondclass; //dummy declaration

我对将友谊授予整个第二类没有问题,但是对于授予第三类函数,如果我在同一个头中声明第三类,则没有问题。但是在不同的头文件中,我得到了一些未定义的类型/声明。感谢您的帮助,以下是代码:

#ifndef FIRSTCLASS_H
#define FIRSTCLASS_H

//firstclasss header file

#include "secondclass.h"
#include "thirdclass.h"

class secondclass; //dummy declaration so it can share friendship
class thirdclass;  //it doesnt work when i want to give friendship to a function

class firstclass{
private:
    int a;
    int b;
public:
    friend secondclass; //granting friendship to the whole class
    friend void thirdclass::z(firstclass *); //error
    //use of undefined type 'thirdclass'
    //see declaration of 'thirdclass'

};

#endif FIRSTCLASS_H



#ifndef THIRDCLASS_H
#define THIRDCLASS_H

//thirdclass header file

#include "firstclass.h"

class firstclass;

class thirdclass{
public:
    void z(firstclass *);
};

#endif THIRDCLASS_H

仅当不包含相应类的头时,才需要提供转发声明。因为您已经包括了
secondclass.h
thirdclass.h
,所以应该完全跳过相应的前向声明

但是,在
thirdclass.h
中,您不需要
firstclass.h
:您正在声明指向
firstclass
的指针,而不使用其成员,因此不需要包含


一般的规则是,如果只需要一个指针,就应该向前声明类,并在需要了解类的成员时包含它们的头。

删除thirdclass.h中包含的firstclass.h。它导致在第三类之前定义第一类。注意递归包含


要查看实际定义类的时间(取决于编译器),请在实际类定义之前添加#pragma消息。

没那么简单。他将一等舱的.h包含在三等舱的.h中。递归包含是问题的一部分。@walrii没关系,因为OP的包含保护做得很好。包含保护也隐藏了问题。