Question

Socket a un constructeur qui prend une prise WinSock comme paramètre et la stocke dans une variable privée:

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

J'essaie de créer une classe "Gamesocket" qui analysera les données de ma classe de socket:

class GameSocket : public Socket {

protected:

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

};

À côté de ces classes, j'ai une classe "serveur" qui crée de nouvelles sockets en cas de besoin:

GameSocket* Server::Accept() {

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

}

Cependant, cela me donne une erreur sur le dernier "aille":

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

Je dois manquer quelque chose avec des constructeurs lorsqu'il s'agit de cours dérivés ...

N'allez pas trop dur avec moi, je suis relativement nouveau en C ++ et OOP

Était-ce utile?

La solution

Ajouter un constructeur pour GameSocket

class GameSocket : public Socket {

public:

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

protected:

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

};

Autres conseils

Le construcotr pour Gamesocket doit recevoir un paramètre de socket, puis le passer à la classe de base de socket dans la liste d'initialiseur:

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

Y a-t-il une raison pour laquelle Gamesocket doit dériver de socket au lieu de maintenir une référence à la prise? Gamesocket est (ou devrait) gérer l'état de socket et la sérialisation tandis que l'interface de socket de bas niveau est contenue dans la classe de socket. Votre classe de serveur peut créer des instances de la classe de socket, puis transmettre un pointeur vers une classe Gamesocket pour les gérer.

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top