2

首先,这不是“作业”,它是 Thinking in C++ Vol 1, Chapter 5 ex 5 中的一个问题。我需要制作 3 个类,第一个将其内部的友谊授予整个第二个班级,而友谊只授予一个第三类的功能。

我对整个第二类授予友谊没有问题,但是在授予第三类功能时,如果我在同一个标​​题中声明第三类,则没有问题。但是在不同的标题中,我得到了一些未定义的类型/声明。感谢您的帮助,这里是代码:

#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
4

2 回答 2

2

只有在不包含相应类的标头时才需要提供前向声明。由于您已经包含了两者secondclass.hthirdclass.h因此您应该完全跳过相应的前向声明。

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

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

于 2012-08-05T02:45:25.773 回答
0

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

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

于 2012-08-05T03:08:47.230 回答