4

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

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

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

4

7 回答 7

11

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

如果是错误,请使用throw some_exception_goes_here;, 因为这比使用 NULL 值更容易。

如果您只想忽略它,请返回一个空向量,然后确保下面的代码不会对空向量产生问题。

于 2013-05-30T15:21:00.633 回答
7

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

我希望这个名字能说明它的意图。

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

于 2013-05-30T15:15:51.733 回答
1

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

boost文档在此处提供了一些示例。

此功能似乎足够基本,您可能希望它成为标准库的一部分。可悲的是,它不是(还)。请参阅相关:C++ 标准库中的 boost::optional 替代方案

于 2013-05-30T15:16:16.947 回答
1

我认为不需要任何boost::optionalnor std::exception。您应该返回的是一个空向量。想想看。该函数返回一个整数列表,函数调用者对整数列表进行操作。如果列表为空,则没有可操作的内容。例如(伪)

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

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

于 2013-05-30T15:21:59.563 回答
0

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

于 2013-05-30T15:21:46.447 回答
0

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

这样做也意味着您不会在返回值上调用 std::vector<> 复制构造函数。

如果您已经安装并启动并运行了 boost,我会很想返回 boost::optional 正如其他答案所示。但请注意,提高工作效率可能会让人头疼,(它有自己的构建环境,这是一个学习曲线),尤其是在您使用 StlPort 时。

于 2013-05-30T15:26:54.640 回答
-2

你只是不能在 C++ 中做到这一点。

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

于 2013-05-30T15:13:59.583 回答