classi C ++ - dichiarazione di costruzione della classe derivata
-
23-08-2019 - |
Domanda
Socket ha un costruttore che prende un socket Winsock come parametro e lo memorizza in una variabile privata:
Socket::Socket(SOCKET s) {
this->s = s;
}
Sto cercando di fare una classe "GameSocket" che analizzare i dati dalla mia classe Socket:
class GameSocket : public Socket {
protected:
void ParseData(unsigned char* data, int size);
};
Accanto a queste classi, ho una classe "server" che crea nuovi socket quando necessario:
GameSocket* Server::Accept() {
SOCKET a = accept(s, 0, 0);
if(a==SOCKET_ERROR) {
return 0;
}
else {
return new GameSocket(a);
}
}
Tuttavia, questo mi dà un errore sull'ultima "altro":
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
Devo mancare qualcosa con i costruttori quando si tratta di classi derivate ...
Non andare troppo duro con me, io sono relativamente nuovo per C ++ e OOP
Soluzione
Aggiungi in un costruttore per GameSocket
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
Altri suggerimenti
Il construcotr per GameSocket deve ricevere un parametro socket e poi passarlo alla classe di base Socket nella lista di inizializzazione:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
C'è un motivo per cui GameSocket deve derivare dalla presa invece di tenere un riferimento alla presa di corrente? GameSocket è (o dovrebbe essere) gestione dello stato presa e serializzazione mentre l'interfaccia di basso livello presa è contenuta nella classe Socket. La classe Server potrebbe creare istanze della classe Socket e poi passare un puntatore a una classe GameSocket per la loro gestione.
class GameSocket {
public:
GameSocket(Socket *s) : s_(s) {}
~GameSocket() {
s_->close();
delete s_;
}
...
private:
Socket *s_;
};
GameSocket* Server::Accept() {
// accept function added to Socket class
Socket *newSocket = serverSocket->accept();
// create GameSocket with newly opened Socket
return newSocket ? new GameSocket(newSocket) : NULL;
}