Classes C ++ - Declaração do Construtor em Classe Derivada
-
23-08-2019 - |
Pergunta
O soquete possui um construtor que toma um soquete de winsock como parâmetro e o armazena em uma variável privada:
Socket::Socket(SOCKET s) {
this->s = s;
}
Estou tentando fazer uma classe "Gamesocket" que analisará dados da minha classe de soquete:
class GameSocket : public Socket {
protected:
void ParseData(unsigned char* data, int size);
};
Ao lado dessas aulas, tenho uma classe "servidor" que cria novos soquetes quando necessário:
GameSocket* Server::Accept() {
SOCKET a = accept(s, 0, 0);
if(a==SOCKET_ERROR) {
return 0;
}
else {
return new GameSocket(a);
}
}
No entanto, isso me dá um erro no último "else":
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
Devo estar perdendo algo com construtores ao lidar com aulas derivadas ...
Não fique muito duro comigo, sou relativamente novo para C ++ e OOP
Solução
Adicione um construtor para o GameSocket
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
Outras dicas
O construcotr para o GameSocket deve receber um parâmetro de soquete e depois passá -lo para a classe base do soquete na lista de inicializadores:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
Existe uma razão pela qual o GameSocket deve derivar do soquete em vez de manter uma referência ao soquete? O Gamesocket está (ou deve estar) gerenciando o estado do soquete e a serialização, enquanto a interface de soquete de baixo nível está contida na classe de soquete. Sua classe de servidor pode criar instâncias da classe de soquete e depois passar um ponteiro para uma classe Gamesocket para gerenciá -las.
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;
}