从不同标头中定义的类向函数授予友谊 首先,这不是“作业”,它是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的包含保护做得很好。包含保护也隐藏了问题。