C ++类 - 派生类中的构造方法声明
-
23-08-2019 - |
题
套接字具有将Winsock套接字作为参数的构造函数,并将其存储在私有变量中:
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);
}
}
但是,这给了我最后一个“ else”的错误:
error C2664: 'GameSocket::GameSocket' : cannot convert parameter 1 from 'SOCKET' to 'const GameSocket &'
在处理派生类时,我必须缺少构造函数的东西...
不要对我太努力,我对C ++和OOP相对较新
解决方案
添加gamemocket的构造函数
class GameSocket : public Socket {
public:
// you need to add
GameSocket(SOCKET s) : Socket(s) {}
protected:
void ParseData(unsigned char* data, int size);
};
其他提示
Gamesocket的ColdenCotr必须接收套接字参数,然后将其传递到初始化器列表中的套接字基类:
class GameSocket : public Socket {
public:
GameSocket(SOCKET s) : Socket(s) {}
...
};
Gamesocket必须从套接字派生而不是持有套接字的引用的原因是有原因的吗? Gamesocket是(或应该)管理套接字状态和序列化,而低级套接字接口则包含在插座类中。您的服务器类可以创建套接字类的实例,然后将指针传递给Gamesoket类以管理它们。
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;
}
不隶属于 StackOverflow