C ++, проверка инициализации переменной, когда я не могу использовать NULL / 0 - PullRequest
0 голосов
/ 03 октября 2019

Мне нужно проверить, инициализирована ли переменная. Я новичок в C ++, так что, возможно, я думаю об этом неправильно. Я хочу сделать следующее:

if (variable) {
    // do some stuff
}

Моей первой мыслью было установить значение NULL при объявлении. Однако оказывается, что NULL идентичен 0 в C ++. К сожалению, моя переменная представляет собой двойное число, которое может быть равно 0. Все решения, которые я мог найти в Интернете, касаются указателей и просто говорят, что нужно использовать nullptr, но это, конечно, невозможно в моем случае.

Какие альтернативы у меня есть здесь

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Общий способ сделать это - использовать std::optional

https://en.cppreference.com/w/cpp/utility/optional

Этот тип данных охватывает внутренний тип и предоставляет методы, чтобы сообщить вам, был ли он установлен или нет.

Обратите внимание, что вам понадобится компилятор C ++ 17.

Вот пример. Вы можете видеть, что его довольно просто использовать, и вам не нужно создавать значения часового типа (то есть специальные значения, которые интерпретируются для случая, когда они не установлены).

#include <iostream>
#include <cstdlib>
#include <optional>

using namespace std;

int main()
{
    optional<double> speed;
    if (!speed)
    {
        cout << "speed not set" << endl;
    }
    speed = 0;
    if (speed)
    {
        cout << "speed set to " << *speed << endl;
    }
}
0 голосов
/ 03 октября 2019

Мои знания в C ++ очень ограничены, но, исходя из вашего описания, я считаю, что вы используете примитивный встроенный тип C ++ (int, double, bool, ...). Если это так, то трудно узнать, была ли инициализирована ваша переменная, поскольку все типы примитивов имеют свое значение по умолчанию на случай, если оно объявлено, но не присвоено значение.

Один способ, которым я привык ходитьвокруг этой проблемы заключается в том, что всегда инициируйте переменные со специальными значениями по умолчанию. Однако, если переменным присваиваются значения, которые соответствуют значениям по умолчанию, это может быть проблемой.

Однако я нахожу это редким случаем, потому что если вы используете библиотеку, тогда у класса должен быть метод /переменная ... чтобы вы знали статус текущего экземпляра, если это необходимо. В противном случае класс должен инициализировать допустимые значения по умолчанию, или вы используете его неправильно. Если вы создаете свой собственный класс, тогда легко добавить в него переменную состояния, верно?

Как я уже говорил, мои знания очень ограничены, хотя я могу ошибаться.

...