两个类别包含彼此的成员

时间:2016-05-12 19:41:11

标签: c++

我有两个类:User.h和Room.h,它们都包含指向另一个类的对象的指针(用户到房间和用户的房间)。 我想我知道如何包含 .h 文件,但我仍然在我的 .cpp 文件(user.cpp)中出现错误。

user.h

#ifndef USER_H
#define USER_H

class Room;

using namespace std;

class User
{
private:
    Room* _currRoom;
public:
    //some functions...
};

#endif

room.h

#ifndef ROOM_H
#define ROOM_H

#include "User.h"

class Room
{
private:
    vector<User*> _users;
    User* _admin;
    int _maxUsers;
    int _questionTime;
    int _questionsNo;
    string _name;
    int _id;

public:
    Room(int id, User* admin, string name, int maxUsers, int questionsNo,int questionTime);
    //more functions...
};

#endif

我在user.cpp中的room.cpp和room.h中包含了user.h 我做了什么问题?

1 个答案:

答案 0 :(得分:0)

room.h中,将#include "User.h"替换为转发声明。在.h文件中使用前向声明,并将相应的#include语句移到.cpp个文件中:

user.h

#ifndef USER_H
#define USER_H

class Room;

using namespace std;

class User
{
private:
    Room* _currRoom;
public:
    //some functions...
};

#endif

user.cpp

#include "user.h"
#include "room.h"
...

room.h

#ifndef ROOM_H
#define ROOM_H

#include <vector>
#include <string>

class User;

class Room
{
private:
    vector<User*> _users;
    User* _admin;
    int _maxUsers;
    int _questionTime;
    int _questionsNo;
    string _name;
    int _id;

public:
    Room(int id, User* admin, string name, int maxUsers, int questionsNo, int questionTime);
    //more functions...
};

#endif

room.cpp

#include "room.h"
#include "user.h"
...

如果你不以这种方式进行前向声明,你可以最终处于一个循环的情况,其中一个标题通过另一个标题间接地包含自己(A包括B,其中包括A),因此它的标题保护已经已被定义,以防止其声明被处理,从而导致错误。