Я знаю, что это должно быть вопрос n00b, но я должен реализовать макет последовательного взаимодействия клиент-сервер приложение, и поскольку количество вызовов клиент-сервер варьируется, я не могу просто повторять шаги во внешней функции, всегда получая данные от клиента, а затем пересылая их на сервер и наоборот, поэтому мне нужно сделать Классы Server
и Client
знают друг о друге, поэтому они могут вызывать свои общедоступные методы между собой. Один подход состоял бы в том, чтобы спроектировать оба как синглтоны, но я надеялся сделать это более простым способом, точнее, используя циклическую ссылку: клиент хранит ссылку на сервер, а сервер хранит ссылку на клиента.Я понимаю, что это может быть не очень хороший подход, и это может привести к взрыву стека вызовов , когда он станет слишком глубоким, поэтому любые улучшения в моем дизайне приветствуются.
Для достижения описанной реализации я подумал, что могу использовать std::shared_ptr
, потому что std::unique_ptr
не будет работать, если я также хочу предотвратить две переменные из main не затираются, когда я вызываю два сеттера (правильно?). Итак, вот что у меня есть (упрощенный код):
#include
#include
class Server;
class Client
{
public:
void SetServer (const Server &server);
private:
std::shared_ptr server;
};
void Client::SetServer (const Server &server)
{
this->server = std::shared_ptr(&server);
}
class Server
{
public:
void SetClient (const Client &client);
private:
std::shared_ptr client;
};
void Server::SetClient (const Client &client)
{
this->client = std::shared_ptr(&client);
}
int main ()
{
Server server;
Client client;
server.SetClient(client);
client.SetServer(server);
//Here I ask the client to start interacting with the server.
//The process will terminate once the client
//exhausts all the data it needs to send to the server for processing
return 0;
}
К сожалению, мой код, кажется, пытается несколько раз вызвать деструкторы Client и Server (неявные) или что-то подобное, и я уверен, что это вызвано из-за моего плохого понимания того, как должен работать std::shared_ptr
. Пожалуйста, порекомендуйте.