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

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top