我有一个带有以下标题的函数:
std::vector<NxU32> MySewer::createCuttingArray(MyCloth** cloth, NxU32 startPoint, NxU32 endPoint)
该函数应该返回包含一些整数值的向量。但是有一个问题:如果没有正确创建行(有一种方法可以发生这种情况),我想做一些类似我在Java和C#中所做的事情来返回NULL。但是从我看到的,在C ++中,NULL被定义为整数值。如何为向量返回有效的NULL?
答案 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::optional
或std::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。