Я немного новичок в программировании на С ++ и пишу менеджер объектов для многопользовательской игры, но у меня есть некоторые сомнения относительно того, как управлять объектами клиента. Объект client состоит из параметров подключенного клиента (таких как IP, время подключения, полученные данные и т. Д.).
Чтобы избежать фрагментации памяти, я планирую выделить пул объектов с максимально допустимым числом клиентов. Для этого я пишу менеджер объектов клиента следующим образом:
ClientManager.h
#include "Client.h"
class ClientManager {
public:
static void init(int max); //initialize pool (allocate memory)
static void dispose(); //dispose pool (deallocate memory)
static bool add(int socketFd); //add connected client by its socket file descriptor
static bool remove(int socketFd); //remove connected client by its socket fd
static Client& get(int socketFd); //get the client object by its socket fd
private:
Client* clientList; //array of allocated clients objects
int maxClient; //max number of connected clients allowed
Обратите внимание, что этот класс будет называться только статическим способом, поэтому здесь нет конструкторов / деструкторов. Этот класс должен быть статическим, поскольку крайне важно, чтобы данные клиента можно было читать / изменять между различными типами объектов.
Реализация будет выглядеть примерно так:
ClientManager.cpp
void ClientManager::init(int max) {
maxClient = max;
clientList = new Client[maxClient];
}
void ClientManager::dispose() {
maxClient = 0;
delete [] clientList;
clientList = NULL;
}
bool ClientManager::add(int socketFd) {
//search pool for non-initialized object
//if(there is a non-initializes object) { initialize it with socketFd and return true}
//else return false;
}
bool ClientManager::remove(int socketFd) {
//search pool for socketFd
//if(socketFd found) { clear object (make it non-initialized) and return true}
//else return false
}
Client& ClientManager::get(int socketFd) {
//search for object position
if(pos) return clientList[pos];
else ???????
}
Теперь, как мне управлять возвратом объекта в функции get? Это по ссылке лучший вариант? Я не хочу возвращать указатель, но если это мой последний вариант, я могу с этим жить. Я думаю, я могу убедиться, что я получаю только зарегистрированный (инициализированный) объект в пуле, если так, нужна ли эта проверка в функции get? Я не хочу утверждения, потому что я хочу, чтобы код был устойчивым и не останавливался во время выполнения (я новичок в C ++, поэтому, если я говорю что-то не так, пожалуйста, исправьте меня).
в основной программе, я думаю что-то вроде:
Daemon.cpp
#include "ClientManager.h"
int main(...) {
ClientManager::init(100);
while(1) {
//do server stuff
//get onConnect event (new client is connecting)
//get onDisconnect event (connected client has gone offline)
//get onDataReceived event (connected client has sent data)
}
}
void onConnect(int socketFd) {
ClientManager::add(socketFd);
}
void onDisconnect(int socketFd) {
ClientManager::remove(socketFd);
}
void onDataReceived(int socketFd) {
do_something(ClientManager::get(socketFd).data);
}
Я правильно делаю? Спасибо
Примечания:
1) Этот код у меня в голове, и я набрал его здесь, поэтому, возможно, я кое-что забыл.
2) Программа будет прервана только из-за уничтожения (я использую linux), поэтому метод распоряжения ClientManager не будет явно вызываться в основной программе (так как это статический класс). Опять же, если я говорю что-то не так, пожалуйста, скажите мне!
3) Извините за мой плохой английский:)