在应该返回向量的函数中返回NULL

时间:2013-05-30 15:11:51

标签: c++ vector null

我有一个带有以下标题的函数:

std::vector<NxU32> MySewer::createCuttingArray(MyCloth** cloth, NxU32 startPoint, NxU32 endPoint)

该函数应该返回包含一些整数值的向量。但是有一个问题:如果没有正确创建行(有一种方法可以发生这种情况),我想做一些类似我在Java和C#中所做的事情来返回NULL。但是从我看到的,在C ++中,NULL被定义为整数值。如何为向量返回有效的NULL?

7 个答案:

答案 0 :(得分:11)

处理这个问题的“正确”方法实际上取决于接收向量的代码实际上做了什么。它是导致错误的原因,还是“我们忽略了”?

如果是错误,请使用throw some_exception_goes_here;,因为这比使用NULL值下线要容易得多。

如果你想忽略它,返回一个空向量,然后确保下面的代码不会出现空向量问题。

答案 1 :(得分:7)

根据您的描述,您想要的是boost::optional<std::vector<NxU32>>

我希望这个名字的意图明显。

http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html

答案 2 :(得分:1)

boost::optional<T>通过将类型T扩展为可以“具有T类型的值”或“没有值”的类型来解决此问题。在您的情况下,您将返回boost::optional<std::vector<NxU32>>,因为在某些情况下,您希望返回“没有”。

boost文档包含一些示例here

此功能似乎足够基本,您可能希望它成为标准库的一部分。可悲的是,它还没有。请参阅相关内容:boost::optional alternative in C++ Standard Library

答案 3 :(得分:1)

我认为不需要任何boost::optionalstd::exception。你应该返回的是一个空的向量。想一想。该函数返回一个整数列表,函数调用者在整数列表上运行。如果列表为空,那么操作员就没有任何内容。例如(在psuedo中)

std::vector<T> data = createData(args);
for(int i = 0; i < data.size(); ++i){
      calculate(data[i]);
}

如果数据为空,则不会执行for循环。不需要空检查或异常处理。

答案 4 :(得分:0)

你做不到。要模拟.NET中引用类型的行为,哪些变量可以附加到实际对象或为null,您需要在C ++中使用指针。指针可以是NULL或指向有效对象。

答案 5 :(得分:0)

总的来说,我想我会改变模式。在调用者中创建向量,作为引用(或指针)传递到函数中,并使bool返回true / false表示成功或失败。

这样做也意味着你没有调用std :: vector&lt;&gt;复制构造函数的返回值。

如果你已经安装了升级并启动并运行,我很想回复boost :: optional,因为其他答案表明。但请注意,提升工作可能会令人头疼(它有自己的构建环境,这是一个学习曲线),特别是如果你使用的是StlPort。

答案 6 :(得分:-2)

你不能用C ++做到这一点。

您正在返回一个将被复制的矢量(并在其他事物中实例化)。另一件事是你不能将不是向量的东西转换为NULL。