C++ 类 - 派生类中的构造函数声明
Posted
技术标签:
【中文标题】C++ 类 - 派生类中的构造函数声明【英文标题】:C++ classes - constructor declaration in derived class 【发布时间】:2008-12-22 14:19:52 【问题描述】: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 还比较陌生
【问题讨论】:
【参考方案1】:为 GameSocket 添加一个构造函数
class GameSocket : public Socket
public:
// you need to add
GameSocket(SOCKET s) : Socket(s)
protected:
void ParseData(unsigned char* data, int size);
;
【讨论】:
构造函数不应该在 public: 类的块中吗? 其中一个 C++ 烦恼:构造函数不可继承。我确信这是有充分理由的,但我希望在我不提供自己的情况下继承公共结构,该死!【参考方案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;
【讨论】:
好点。我希望提问者(丹尼尔)会考虑选择组合而不是继承。在这种情况下,组合选项似乎被忽略了。以上是关于C++ 类 - 派生类中的构造函数声明的主要内容,如果未能解决你的问题,请参考以下文章