Циклические ссылки между двумя классами

Я знаю, что это должно быть вопрос 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. Пожалуйста, порекомендуйте.

5
задан Community 23 May 2017 в 12:19
поделиться