1

Socket 有一个构造函数,它接受一个 winsock SOCKET 作为参数并将其存储在一个私有变量中:

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

我正在尝试创建一个类“GameSocket”,它将解析来自我的 Socket 类的数据:

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) {}
    ...
};

为什么 GameSocket 必须从 Socket 派生而不是持有对 Socket 的引用?GameSocket 正在(或应该)管理套接字状态和序列化,而低级套接字接口包含在 Socket 类中。您的 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 回答