我正在尝试实现一个多态队列。这是我的试验:
QQueue <Request *> requests;
while(...)
{
QString line = QString::fromUtf8(client->readLine()).trimmed();
if(...)){
Request *request=new Request();
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage(); //this initialize variables in request using tcpMessage
if(request->requestType==REQUEST_LOGIN){
LoginRequest loginRequest;
request=&loginRequest;
request->tcpMessage=line.toUtf8();
request->decodeFromTcpMessage();
requests.enqueue(request);
}
//Here pointers in "requests" do not point to objects I created above, and I noticed that their destructors are also called.
LoginRequest *loginRequest2=dynamic_cast<LoginRequest *>(requests.dequeue());
loginRequest2->decodeFromTcpMessage();
}
}不幸的是,由于我在第二条评论中提到的原因,我无法使用这段代码来创建工作多态队列。我想,我需要使用智能指针,但如何使用呢?我对代码的任何改进或多态队列的新实现都持开放态度。
谢谢。
发布于 2010-04-08 17:55:25
您放置的指向QQueue的指针无效。如果你的QQueue包含指针,你需要在堆上创建你插入到它的每个对象,也就是调用new。此外,如果您不需要第一个创建的Request,请不要忘记释放它。
我认为你应该重写你的代码来:
...
if(request->requestType==REQUEST_LOGIN){
delete request;
request = new LoginRequest();
request->tcpMessage=line.toUtf8();
...
}有了这段代码,以后的dynamic_cast<LoginRequest*>就不会失败。
发布于 2010-04-08 17:34:18
从代码片段中,我可以立即看到Request的一个对象正在排队,稍后您会尝试将其转换为LoginRequest。dynamic_cast将理所当然地失败。您必须解析请求数据并创建从请求派生的适当类的对象。为此,我建议使用工厂模式。
发布于 2010-04-09 09:51:50
这也是一个使用工厂的好地方。
if(...)){
Request *request = CreateRequest(message);
requests.enqueue(request);
}
Request* request = requests.pop();
LoginRequest* login_req = dynamic_cast<LoginRequest*>(request);
if (login_req != NULL)
whatever;哪里
Request* CreateRequest(TcpMessage* message)
{
TcpMessage* message = line.toUtf8();
RequestType type = message->GetRequestType();
Request* req = NULL;
switch (type)
{
case REQUEST_LOGIN:
req = new LoginRequest(message);
break;
etc.
}
delete message;
return req;
}...and然后,自然地,您的构造函数对消息做正确的事情,正确地初始化对象。
https://stackoverflow.com/questions/2598723
复制相似问题