2008-12-22 11 views
1

Socket a un constructeur qui prend une prise winsock en tant que paramètre et stocke dans une variable privée:classes C + - Déclaration du constructeur dans la classe dérivée

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

Je suis en train de faire une classe « GameSocket » qui analyser les données de ma classe Socket:

class GameSocket : public Socket { 

protected: 

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

}; 

a côté de ces classes, j'ai une classe "serveur" qui crée de nouvelles prises de courant 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 la dernière « else »:

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

Je dois manquer quelque chose avec les constructeurs lorsqu'ils traitent avec les classes dérivées ...

Ne pas aller trop dur pour moi , je suis relativement nouveau pour C++ et POO

Répondre

6

Ajouter dans 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); 

}; 
+0

Le constructeur ne devrait pas être dans le public: block de la classe? – Laserallan

+0

oh oui - le corrigera - merci –

+0

Un de ces inconvénients C++: les constructeurs ne peuvent pas être hérités. Je suis sûr qu'il y a de bonnes raisons à cela, mais je veux que les copnstructeurs publics soient hérités quand je ne fournis pas le mien, bon sang! – Arkadiy

2

Le construcotr pour GameSocket doit rec eive un paramètre SOCKET et passer ensuite à la classe de base Socket dans la liste initialiseur:

Y at-il une raison pour laquelle GameSocket doit tirer de la prise au lieu de tenir une référence à la prise? GameSocket est (ou devrait être) la gestion de l'état et de la sérialisation du socket alors que l'interface de socket de bas niveau est contenue dans la classe Socket. Votre classe Server peut créer des instances de la classe Socket, puis transmettre un pointeur à 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; 
} 
+0

Bon point. J'espère que le demandeur (Daniel) envisagera de choisir la composition plutôt que l'héritage. L'option de composition semble être négligée dans des cas comme ceux-ci. – pestophagous