Pregunta

Socket tiene un constructor que toma un socket Winsock como parámetro y lo almacena en una variable privada:

Socket::Socket(SOCKET s) {
    this->s = s;
}

Estoy tratando de hacer una clase "GameSocket" que va a analizar los datos de mi clase Socket:

class GameSocket : public Socket {

protected:

    void ParseData(unsigned char* data, int size);

};

Al lado de estas clases, tengo una clase "Servidor" que crea nuevas tomas cuando sea necesario:

GameSocket* Server::Accept() {

    SOCKET a = accept(s, 0, 0);
    if(a==SOCKET_ERROR) {
        return 0;
    }
    else {
        return new GameSocket(a);
    }

}

Sin embargo, esto me da un error en la última "cosa":

error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'

Debo estar perdiendo algo con constructores cuando se trata de las clases derivadas ...

No vaya demasiado duro para mí, que soy relativamente nuevo en C ++ y programación orientada a objetos

¿Fue útil?

Solución

Añadir en un constructor de GameSocket

class GameSocket : public Socket {

public:

    // you need to add
    GameSocket(SOCKET s) : Socket(s) {}

protected:

    void ParseData(unsigned char* data, int size);

};

Otros consejos

El construcotr para GameSocket debe recibir un parámetro de toma de corriente y luego pasarlo a la clase base Socket en la lista de inicialización:

class GameSocket : public Socket {
public:
    GameSocket(SOCKET s) : Socket(s) {}
    ...
};

¿Hay una razón por la GameSocket debe derivar de zócalo en lugar de mantener una referencia a la toma? GameSocket es (o debe ser) la gestión de estado socket y la serialización mientras que la interfaz de bajo nivel de socket está contenido en la clase Socket. Su clase de servidor podría crear instancias de la clase Socket y luego pasar un puntero a una clase GameSocket para su gestión.

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top