std :: queue初始化为NULL

时间:2012-04-16 05:53:21

标签: c++ initialization queue

是否可以像其他变量一样初始化具有std::queue值的C ++ NULL

像这样:

HANDLE variable = NULL; 

class Test
{
}

std::queue<Test*> testQueue = NULL;

testQueue.empty();

或类似的东西?

4 个答案:

答案 0 :(得分:7)

如果你这样写:

std::queue<Test*> testQueue; //it is default initialized
那么这就足够了;不需要指针并用NULL初始化它。

另外,你可以这样做:

if ( testQueue.empty()) 
{
    //testQueue is empty
}

答案 1 :(得分:2)

如果您使用指向队列的指针,您当然可以将其初始化为空指针(但如果可能的话,您可能希望避免这种情况)。

如果你只是定义一个队列,你可以测试它是否为空(正如你所建议的那样.empty())。

答案 2 :(得分:2)

要直接回答您的问题,请不要使用空指针初始化它。默认情况下,队列为空,这就是您测试的内容(如其他答案所示)。但是,我认为这里存在一个潜在的问题,比这更深入一点,就指针来说太多了。

由于您使用的是容器,我建议不要使用std::queue<Object *>。相反,我建议尽可能使用std::queue<Object>(存储对象,而不是指针)。而不是使用任何类型的空值来指示对象不处于有效状态,只需初始化构造函数中的值(因此所有对象都处于有效状态),然后std::queue中的所有对象都有效。在C ++中,这应该是您对如何使用对象的偏好:

  1. 如果您需要处理对象集合,直接在堆栈上创建对象或存储在容器(最好是STL容器)中
  2. 引用(例如,如果要将对象传递给函数并希望避免复制,但此处引用是指通过1创建的对象)
  3. 智能指针(这应该是代码中new出现的唯一时间)。这些应该谨慎使用,并且只有当您确定通过1创建对象时才会起作用。
  4. 常规指针。这应该几乎不会被使用。在我的大多数项目中,我都不使用任何原始指针。在其余部分,我只使用它们作为一种缓存机制,其中长计算确定我正在操作的对象,并且空指针意味着我还没有确定它。但是,我仍然不创建对象,其“主要”句柄是指针;指针指向我通过1创建的对象。
  5. 在确定要在容器中存储的内容时,您还应该遵循上述内容(首先选择对象集合,然后是引用,然后是智能指针,最后是原始指针)。

    指针可能在Java中很常见,其中大多数变量是在堆上创建的(或者用C ++的说法,来自免费商店),它们在C中可能有些常见,其中STL,引用和智能指针不在存在,但它们在现代C ++中没有太多的位置。

答案 3 :(得分:1)

队列是带有构造函数的C ++对象。您无需将其初始化为默认值。它始终以空队列开头。 .empty()只是检查它是否为空。如果需要,.clear()会删除其内容,但在新构建的内容中,这不是必需的。