質問

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top