C ++クラス - 派生クラスのコンストラクター宣言
-
23-08-2019 - |
質問
Socketには、Winsock Socketをパラメーターとして取得し、プライベート変数に保存するコンストラクターがあります。
Socket::Socket(SOCKET s) {
this->s = s;
}
ソケットクラスからデータを解析するクラス「Gamesocket」を作成しようとしています。
class GameSocket : public Socket {
protected:
void ParseData(unsigned char* data, int size);
};
これらのクラスの横には、必要に応じて新しいソケットを作成する「サーバー」クラスがあります。
GameSocket* Server::Accept() {
SOCKET a = accept(s, 0, 0);
if(a==SOCKET_ERROR) {
return 0;
}
else {
return new GameSocket(a);
}
}
ただし、これにより、最後の「他の」のエラーが発生します。
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
派生したクラスを扱うとき、私はコンストラクターと何かを欠いているに違いありません...
私を一生懸命に行ってはいけません、私はC ++とOOPに比較的初めてです
解決
GameSocketのコンストラクターを追加します
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
他のヒント
The construcotr for GameSocket must receive a SOCKET parameter and then pass it to the Socket base class in the initializer list:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
Is there a reason why GameSocket must derive from Socket instead of holding a reference to the Socket? GameSocket is (or should be) managing socket state and serialization while the low level socket interface is contained in the Socket class. Your Server class could create instances of the Socket class and then pass a pointer to a GameSocket class for managing them.
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;
}