(C ++) Когда функция возвращает данные, такие как класс или структура, я хочу вернуть ошибку или ложные данные - PullRequest
1 голос
/ 03 марта 2020

Я новичок ie изучаю структуру компьютера ...

В этом случае

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!!
}

Как я могу доставить признак сбоя или ошибки ??

Спасибо, что прочитали мое ужасное предложение на английском sh. Я все еще изучаю английский, я могу читать на английском sh хорошо, но, навыки письма ужасны: (

хорошего дня ~

Ответы [ 3 ]

3 голосов
/ 03 марта 2020

Вы можете использовать std :: необязательный . Убедитесь, что поддержка C ++ 17 включена в вашем компиляторе. Если вы используете G CC или Clang, это означает добавление -std=c++17 к флагам вашего компилятора (или -std=c++1z в более старых версиях GCC / Clang).

#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() , вы должны проверить, является ли возвращаемый необязательный параметр пустым:

auto result = some_node.AddNum(some_number);
if (result) {
    // OK.
    std::cout << "the result is: " << *result;
} else {
    // Error. No result.
}

Чтобы получить значение из необязательного параметра, вы можете использовать оператор * для него так же, как и для указателя. Кроме того, вместо этого вы можете использовать функцию-член value():

std::cout << "the result is: " << result.value();

Если вы попытаетесь получить значение из пустого необязательного параметра, будет выдано исключение времени выполнения.

2 голосов
/ 03 марта 2020

Функция AddNum возвращает int, поэтому вы не можете вернуть bool. Таким образом, у вас есть несколько вариантов в этом случае:

  1. Измените функцию, чтобы она возвращала bool, указывающую на успех или неудачу, и передавала результат через аргумент по ссылке. Например:
bool Node::AddNum(int num, int& result)
{
   if (condition)
   {
       result = num;
       return true;
   }
   else
   {
       result = 0;
       return false;
   }
}

И вы бы вызвали функцию таким образом:

Node n;
int result;
bool success = n.AddNum(num, result);
Создайте исключение, хотя иногда это осуждается в зависимости от обстоятельств:
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.
1 голос
/ 03 марта 2020

Вы можете вернуть std::pair или объединение, заключенное в структуру, или пользовательскую структуру или вызвать исключение.

//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);
}
...