如何用NULL填充指针数组?

4

我有一个指针数组:

private:
    LimitOrder* orders[Size];

在构造函数中,我试图用NULL填充它:

InternalIdAssigner::InternalIdAssigner(void):
    lastCleanId(0)
{
    std::fill(orders, orders + Size, NULL);

但这样不起作用,我接收到错误:error C2440:'=':无法将'const int'转换为'LimitOrder *'

如何正确地使用NULL填充数组字段?


3
如果你使用符合C++03x或更高标准的工具链,只需将orders()添加到你的初始化列表中即可。 - WhozCraig
一个std::for_each就足够了。更好的方法是使用智能指针。它们在构造函数中被设置为nullptr。 - Ben
3个回答

7
错误信息有些明显,如果你了解什么是NULL: 一个字面值0
当你将0传递给模板时,推导出的类型是int,而不是指针类型。虽然字面值0可以隐式转换为任何指针类型并成为空指针,但在传递给fill后,它只是一个值为0的int,不能转换为指针类型。
在C++11中,你可以使用nullptr代替NULL。在C++03中,你也可以将指针转换为目标类型:
std::fill(orders, orders + Size, static_cast<LimitOrder*>(0));

但是,为什么要经历这个过程呢?当你可以在初始化列表中零初始化数组时,为什么不这样做呢?

InternalIdAssigner::InternalIdAssigner()
   : lastCleanId(), orders() {}

最后一个在Visual Studio 2012中不起作用,但可能在更现代的编译器中可以运行。 - Oleg Vazhnev

4

如果您正在使用C++11:

std::fill(orders, orders + Size, nullptr);

否则:
std::fill(orders, orders + Size, static_cast<LimitOrder*>(NULL));

或者,如果您不想使用强制转换:

LimitOrder* tmp = NULL;
std::fill(orders, orders + Size, tmp);

3
我的建议:
更改
std::fill(orders, orders + Size, NULL);

to

std::fill(orders, orders + Size, (LimitOrder*)NULL);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接