首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(C++)当函数返回类或结构之类的数据时,我希望返回错误或假数据

(C++)当函数返回类或结构之类的数据时,我希望返回错误或假数据
EN

Stack Overflow用户
提问于 2020-03-03 12:24:01
回答 3查看 48关注 0票数 1

我是一个学习计算机结构的新手。

在这种情况下

代码语言:javascript
运行
复制
class Node{
   private:
      int data;
   public:
      Node(int num);
      int AddNum(int num);
}

Node::Node(int num) : data(num) {   }
int::int AddNum(int num)
{
   if(data + num > 10)
      return num;
   else
      return false; // this point!!
}

我如何传递失败或错误的信号??

谢谢你读了我那可怕的英语句子。我还在学英语,我的英语读得很好,但是,,,写作能力很差。

祝你一天愉快~

EN

回答 3

Stack Overflow用户

发布于 2020-03-03 12:46:29

您可以使用std::optional。确保在您的编译器中启用了C++17支持。如果你使用的是GCC或Clang,那就意味着在你的编译器标志中添加-std=c++17 (或者在旧版本的GCC/Clang中添加-std=c++1z )。

代码语言:javascript
运行
复制
#include <optional>

class Node {
private:
    int data;

public:
    Node(int num);
    std::optional<int> AddNum(int num);
};

Node::Node(int num) : data(num) {}

std::optional<int> Node::AddNum(const int num)
{
    if (data + num > 10) {
        return num;
    }
    // Returns a default-constructed optional, which is empty.
    return {};
}

调用AddNum()时,必须检查返回的optional是否为空:

代码语言:javascript
运行
复制
auto result = some_node.AddNum(some_number);
if (result) {
    // OK.
    std::cout << "the result is: " << *result;
} else {
    // Error. No result.
}

要从optional中获取值,可以使用*运算符,就像使用指针一样。或者,您可以改用value()成员函数:

代码语言:javascript
运行
复制
std::cout << "the result is: " << result.value();

如果你试图从一个空的optional中获取一个值,将会抛出一个运行时异常。

票数 3
EN

Stack Overflow用户

发布于 2020-03-03 12:43:37

函数AddNum返回int,所以不能返回bool。因此,在这种情况下,您有几个选择:

  1. 更改函数以返回指示成功或失败的bool,并通过引用将结果传递回参数。例如:

代码语言:javascript
运行
复制
bool Node::AddNum(int num, int& result)
{
   if (condition)
   {
       result = num;
       return true;
   }
   else
   {
       result = 0;
       return false;
   }
}

你可以这样调用这个函数:

代码语言:javascript
运行
复制
Node n;
int result;
bool success = n.AddNum(num, result);

  1. 抛出异常,尽管有时会根据circumstances:

而对此表示不满

代码语言:javascript
运行
复制
int Node::AddNum(int num)
{
   if (condition)
   {
       return num;
   }
   else
   {
       throw std::invalid_argument("Invalid argument");
   }
}

Of course the caller would need to handle the exception.
票数 2
EN

Stack Overflow用户

发布于 2020-03-03 14:16:18

您可以返回包装在结构或自定义结构中的std::pair或联合,或者引发异常。

代码语言:javascript
运行
复制
//Using pair. If first element is true, only then 
//second element hold meaning
int::int AddNum(int num)
{
   if(data + num > 10)
      return make_pair(true, num);
   else
      return make_pair(false, -1);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60500034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档