2015-01-26 2 views
1

привет, ребята, у меня есть вопрос о моем маленьком проекте, когда я пытаюсь скомпилировать код ниже, я получаю ошибку, что один из моих классов не могу видеть другие, пожалуйста, помогите мне! Я думаю, что мне нужно немного исправить это. спасибо.Циркулярная зависимость классов

#ifndef CLIENT_H_ 
#define CLIENT_H_ 

#include <iostream> 
#include <string> 
#include <vector> 
#include "Message.h" 
#include "Server.h" 


class Client 
{ 
private: 
    Server* server; 
    string name; 
    vector<Message*> Messages; 
public: 
    Client(string _name, Server* _server); 
    void printAllMessages(); 
    void printUnreadedMessages(); 
    bool sendMessage(string, string); 
    void reciveMessage(Message*); 
    string getName(); 
}; 

#endif 



#ifndef SERVER_H_ 
#define SERVER_H_ 

#include "Client.h" 
#include "Message.h" 
#include <string> 
#include <map> 


class Server 
{ 
private: 
    map<string,Client*> clients; 
    bool checkIfClientExist(string name); 
public: 
    Server(); 
    bool sendMessage(string,Message*); 
    void addClient(Client* toBeAdded); 
    void printAllClients(); 
}; 

#endif 

В файле включены в client.h: 8: 0, из client.cpp: 1: server.h: 13: 13: ошибка: «Клиент» не был объявлен в этой области видимости карты клиентов; это полный код ошибки

+0

В файле включены в client.h: 8: 0, из client.cpp: 1: server.h: 13: 13: ошибка: 'Клиент' не был объявлен в этой области видимости карте <строка, клиент * > клиентов; это полный код ошибки – user3216932

+0

У вас есть круговая зависимость. Клиент включает сервер, который включает в себя клиент, который включает в себя сервер, который ... – Borgleader

ответ

3

У вас есть круговая зависимость между вашими двумя файлами заголовков. Client.h включает Server.h и Server.h включает в себя Client.h. По мере расширения Client.h он включает в себя охрану CLIENT_H_, а затем (в конце концов) пытается развернуть Server.h, который пытается включить Client.h второй раз. Блокировка включения блокирует его, поскольку он уже определен, поэтому class Client никогда не определяется перед анализируемым кодом Server.h.

Решение здесь пересылать-объявить Client следующим образом:

class Client; 

Вы можете поместить эту строку внутри Server.h, или в Client.h выше включают охрану.

+1

Имея в виду, что вы можете ссылаться только на 'Client *' (а не на какие-либо методы или члены) в файле заголовка и сохранять все реальные возможности использования CPP-файла реализации. – crashmstr

Смежные вопросы