1

Socket には、パラメーターとして winsock SOCKET を取り、それをプライベート変数に格納するコンストラクターがあります。

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

Socket クラスからデータを解析するクラス「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);
    }

}

ただし、これにより、最後の「else」でエラーが発生します。

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

派生クラスを扱うとき、コンストラクターで何かが欠けているに違いありません...

私は C++ と OOP に比較的慣れていません。

4

2 に答える 2

6

GameSocket のコンストラクターを追加する

class GameSocket : public Socket {

public:

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

protected:

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

};
于 2008-12-22T14:25:01.977 に答える
2

GameSocket のコンストラクターは SOCKET パラメーターを受け取り、それをイニシャライザー リストの Socket 基本クラスに渡す必要があります。

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

Socket への参照を保持する代わりに、GameSocket が Socket から派生しなければならない理由はありますか? 低レベルのソケット インターフェイスが Socket クラスに含まれている間、GameSocket はソケットの状態とシリアル化を管理しています (または管理する必要があります)。Server クラスは Socket クラスのインスタンスを作成し、それらを管理するために GameSocket クラスへのポインターを渡すことができます。

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;
}
于 2008-12-22T14:39:01.637 に答える