类的循环依赖关系

Circular Dependency of classes

本文关键字:关系 依赖 循环      更新时间:2023-10-16

大家好,当我尝试在下面编译代码时,我对我的小项目有疑问,我收到错误,我的一个类看不到其他类,请帮助我!我认为我需要一些小修复来运行它。谢谢。

#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: 错误: 在此作用域映射客户端中未声明"客户端";这是完整的错误代码

两个头文件之间有一个循环依赖关系。 Client.h包括Server.hServer.h包括Client.h。当Client.h被扩展时,它定义了它的包含保护CLIENT_H_,然后(最终)尝试扩展Server.h,它试图第二次包含Client.h。包含保护会阻止它,因为它已经定义,因此在解析Server.h代码之前,class Client实际上永远不会被定义。

此处的解决方案是向前声明Client,如下所示:

class Client;

您可以将该行放在 Server.h 内,或放在包含保护上方的Client.h中。