Ora sono bloccato nel server che sto programmando, semplicemente perché non riesco a trovare un modo valido e affidabile per gestire le mie classi "oggetto singolo", ho tentato il pattern Singleton ma è semplicemente brutto dover digitare tutto più e più volte.
Ho questa classe "TConnectionManager" che in pratica gestisce tutto il codice relativo alla connessione alle connessioni attive sul mio server.
Pattern Singleton - connections.h
Singleton destructor would delete all connections left in "Connections" variable
class TConnectionManager
{
public:
std::list<TConnection*> Connections;
private:
std::mutex ConnectionsLock;
public:
static TConnectionManager& getInstance()
{
static TConnectionManager instance;
return instance;
}
TConnectionManager() = default;
~TConnectionManager();
// non-copyable
TConnectionManager(const TConnectionManager&) = delete;
TConnectionManager& operator=(const TConnectionManager&) = delete;
TConnection* CreateConnection(boost::asio::io_service& IOService);
void ReleaseConnection(TConnection* Connection);
void ProcessConnections();
};
Per me dover digitare "getInstance" più e più volte diventa frustrante così com'è, così ho provato a cercare in molti posti e non sono riuscito a trovare una soluzione migliore, e ci sono anche molti punti di vista diversi.
Ho tentato di farlo, il che sembra molto più pulito:
C Like - connections.h
Without a real destructor, I'd have to call the "ExitConnections" method at the end of the program to delete all remaining active connections, or set the std::atexit method
extern std::list<TConnection*> Connections;
extern std::mutex ConnectionsLock;
TConnection* CreateConnection(boost::asio::io_service& IOService);
void ReleaseConnection(TConnection* Connection);
void ProcessConnections();
void ExitConnections(); // Destructor alike function which deletes all connections
Ho anche provato ad avere uno "spazio dei nomi" di classe statica
Metodi statici e variabili (spazio dei nomi) - connections.h
Same approach as for the C-Like methods and variables, use ExitConnections method act as a destructor to delete all remaining active connections
class TConnectionManager
{
public:
static std::list<TConnection*> Connections;
private:
static std::mutex ConnectionsLock;
public:
static TConnection* CreateConnection(boost::asio::io_service& IOService);
static void ReleaseConnection(TConnection* Connection);
static void ProcessConnections();
static void ExitConnections();
};
Quindi non so quale dei tre modi in seguito menzionati sia l'approccio migliore per gestire questa situazione in cui sono bloccato.