gpt4 book ai didi

c++ - 在循环引用的上下文中处理循环包含

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:03 24 4
gpt4 key购买 nike

作为 an older question of mine 的跟进,我希望实现一个客户端-服务器模型模拟,其中客户端发起一系列操作,这些操作涉及调用服务器上的方法,而服务器又可以调用客户端上的方法(让我们忽略堆栈可能爆炸的问题).

更具体地说,由于我想将实现与定义分开,我将为 Server 类提供 server.h 和 server.cpp,为 Client 类提供 client.h 和 client.cpp。由于 Server 持有对 Client 的引用并从中调用方法,因此它需要 #include "client.h"。此外,Client 持有对 Server 的引用并从中调用方法,它需要 #include "server.h"。在这一点上,即使我在 server.h 和 client.h 中都使用了 header 保护,它仍然会搞砸(是的,这是预期的)所以我决定转发声明 client.h 中的 Server 类和服务器中的 Client 类。H。不幸的是,这还不足以解决问题,因为我也在调用这两个类的方法,所以我设法通过在客户端中包含 server.h 使其编译和运行(据我所知是正确的) server.cpp 中的.cpp 和client.h。

上面的“hack”听起来合理吗?我应该期待一些不可预见的后果吗?有什么“更聪明”的方法可以做到这一点而无需实现代理类吗?

这是实现方式的基本示例:

文件client.h:

#ifndef CLIENT_H
#define CLIENT_H

#include <iostream>
#include <memory>

class Server;

class Client
{
private:
std::shared_ptr<const Server> server;

public:
Client () {}

void setServer (const std::shared_ptr<const Server> &server);

void doStuff () const;

void doOtherStuff () const;
};

#endif

文件客户端.cpp:

#include "client.h"
#include "server.h"

void Client::setServer (const std::shared_ptr<const Server> &server)
{
this->server = server;
}

void Client::doStuff () const
{
this->server->doStuff();
}

void Client::doOtherStuff () const
{
std::cout << "All done!" << std::endl;
}

文件服务器.h:

#ifndef SERVER_H
#define SERVER_H

#include <iostream>
#include <memory>

class Client;

class Server
{
private:
std::weak_ptr<const Client> client;

public:
Server () {}

void setClient (const std::weak_ptr<const Client> &client);

void doStuff () const;
};

#endif

文件服务器.cpp:

#include "server.h"
#include "client.h"

void Server::setClient (const std::weak_ptr<const Client> &client)
{
this->client = client;
}

void Server::doStuff () const
{
this->client.lock()->doOtherStuff();
}

文件 main.cpp:

#include <iostream>
#include <memory>

#include "client.h"
#include "server.h"

int main ()
{
std::shared_ptr<Client> client(new Client);
std::shared_ptr<Server> server(new Server);

client->setServer(server);
server->setClient(client);

client->doStuff();

return 0;
}

最佳答案

我觉得不错。在 client.h 中转发声明服务器并在 server.h 中转发声明客户端是正确的做法。

然后将两个头文件包含在 .c 或 .cpp 文件中是完全没问题的 - 您需要避免的只是将头文件包含在一个圆圈中。

关于c++ - 在循环引用的上下文中处理循环包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14457384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com