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

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top