2014-11-22 77 views
-4

对不起,如果我重复一个问题,但是我找不到相同的内容。 什么是从标准队列中提取元素的正确操作?我看不到从std ::队列中取出元素的方法

T Pop() 
{ T rout; 

    EnterCriticalSection (pCSection); 
    rout = Queue.front(); // here the link is returned 
    Queue.pop();   // here destructor is called 
    LeaveCriticalSection (pCSection); 

    return rout; // -->> there everything falls 
} 

我有一个类T动态内存管理和拷贝构造函数,与front()行拷贝构造函数不会自动被调用。
析构函数释放范围末尾处的内存,并且我拥有带垃圾的实体。

如何强制复制构造?

+3

是否'T'为您的实际情况适当的拷贝构造函数? _“也许强制复制构造函数?”_听起来像是个不错的主意。此外_“有一切都落下了”_不是一个很好的描述你的实际问题。 – 2014-11-22 22:00:04

+0

在调用'Queue.front();'顺便说一句之前,你应该检查队列的大小。 – 2014-11-22 22:01:16

+0

如果T是一个指针,那么整个代码就没用了。 – 2014-11-22 22:02:42

回答

1

你的问题是你没有拷贝赋值操作符?你提到了拷贝构造函数,但你并不是在代码中拷贝构造任何东西。也许你的意思做:

T Pop() 
{ 
    assert(!Queue.empty()); 

    EnterCriticalSection (pCSection); 
    T rout = Queue.front(); 
    Queue.pop(); 
    LeaveCriticalSection (pCSection); 

    return rout; 
} 

甚至:

T rout(std::move(Queue.front())); 
+0

我很喜欢从std :: queue中提取元素的模式,因为这个类只返回链接。谢谢,现在我明白了 - 有两种方法1.重新定义operator =,2.强制复制构造函数。精彩! – 2014-11-22 22:15:19

+0

恐怕_real世界的解决方案会变得更复杂一些:1. assert()在现实中并没有太多帮助(除非选中beforé调用'Pop()')。 2.对'!Queue.empty()'的检查应该在_critical section_中完成。3.如果检查在函数内完成,则必须确定是否应将T()作为虚拟值返回,或者应该抛出异常。 – 2014-11-22 22:37:17

1

“我有一个动态内存类T和拷贝构造函数,...... 我怎么能强制拷贝构造函数?

这很容易

T rout(Queue.front()); 

很可能你错过了为T提供适当的赋值运算符。还看到这里请What is the Rule of Three?


也为你提动态内存管理T类完成。请放轻松,并使用standard container classes,甚至标准dynamic memory management C++的功能优先直接使用newdelete

+0

谢谢,一切都很清楚。 – 2014-11-22 22:15:48

+0

@ so-olitary好。我给了一些额外的建议。 – 2014-11-22 22:27:14