2016-05-12 19 views
0

Ich habe zwei Klassen: User.h und Room.h und beide enthalten einen Zeiger auf ein Objekt der anderen Klasse (Benutzer zu Raum und Raum zu Benutzer). Ich glaube, ich verstehe, wie die .h Dateien enthalten, aber ich bekomme immer noch Fehler in einer meiner .cpp Dateien (user.cpp).Zwei Klassen contaoin Mitglieder voneinander

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 

I enthalten user.h in room.cpp und room.h in user.cpp Was ist das Problem mit was habe ich gemacht?

+2

Sie sollten 'cpp' Dateien nicht enthalten – Rakete1111

+5

Wenn Sie Fehler haben, sollten Sie sie teilen. Wir lieben Fehlertext. – NathanOliver

+0

Fehler Fehler C2514: 'Room': Klasse hat keine Konstruktoren, ich rief den Konstruktor in user.cpp – abcdef123

Antwort

0

Ersetzen Sie in room.h stattdessen #include "User.h" durch eine Vorwärtsdeklaration. Verwenden Sie Vorwärtsdeklarationen in den .h Dateien, und verschieben Sie die entsprechenden #include Aussagen zu den .cpp Dateien:

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

Wenn Sie die Forward-Deklarationen nicht auf diese Weise ausführen, können Sie in einer zirkulären Situation enden, in der sich ein Header indirekt über einen anderen Header (A enthält B, der A enthält) und somit seinen Header enthält Guard wurde bereits definiert und verhindert die Verarbeitung seiner Deklarationen, was zu Fehlern führt.

+0

Vielen Dank! Jetzt kann ich weitermachen – abcdef123

Verwandte Themen