2016-05-12 83 views
0

我有兩個類: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什麼問題我做了什麼?

+2

你不應該包含'cpp'文件 – Rakete1111

+5

如果你有錯誤,你應該分享它們。我們喜歡錯誤文本。 – NathanOliver

+0

錯誤錯誤C2514:'Room':class沒有構造函數,我在user.cpp中調用構造函數 – abcdef123

回答

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),因此它的報頭警衛已經被定義爲阻止它的聲明被處理,從而導致錯誤。

+0

非常感謝!現在我可以繼續 – abcdef123