Проверьте на значение definedness в C++

В Type of query выберите «Рабочие элементы и прямые ссылки», а в Type of links выберите «Вернуть выбранные типы ссылок - дочерние».

enter image description here

6
задан tunnuz 23 January 2009 в 15:11
поделиться

9 ответов

Как другие ответы говорит, C++ не имеет этого понятия. Можно легко работать вокруг этого все же.

У или Вас может быть неопределенное значение, к которому Вы инициализируете панель в конструкторе, обычно-1.0 или чем-то подобном.

Если Вы знаете, что calculate_bar никогда не возвращает отрицательные значения, можно реализовать неопределенную функцию как проверку на <0.0.

Более общее решение имеет bool, говорящий, определяется ли панель уже, что Вы инициализировали ко лжи в конструкторе и когда Вы первый набор это Вы изменяете его на истинный. повышение:: дополнительный делает это изящным шаблонным способом.

Это - то, на что был бы похож пример кода, который Вы имеете.

class Foo {
public:
    double get_bar();
    Foo() : barDefined(false) {}
private:
    double bar;
    bool barDefined;
    void calculate_bar() {
        bar = something();
    }
};

double Foo::get_bar() {
    if ( barDefined == false ) {
        calculate_bar();
        barDefined = true;
    }
    return bar;
}
12
ответ дан 8 December 2019 в 04:32
поделиться

Как другие указали, нет ничего как "неопределенное" состояние. Но можно хотеть изучить boost.optional

6
ответ дан 8 December 2019 в 04:32
поделиться

Почему бы не поддержать отдельный флаг, который инициализируется ко лжи и затем установлен на истинный, когда панель вычисляется. Это может затем быть 'undefed' путем установки флага на ложь снова.

if(!isBarValid)
{
    calculateBar();
    isBarValid = true;
}
return bar;
2
ответ дан 8 December 2019 в 04:32
поделиться

Если Вы имеете в виду во времени выполнения, нет такой вещи. Если bar никогда не инициализируется, это будет иметь любые случайные биты, оказывается, там, в зависимости от того, как объект выделяется (некоторые средства выделения инициализируют новую память, чтобы все-обнулить).

править: это до программиста для обработки объектного состояния в конструкторах и/или ручных методах инициализации как init()

3
ответ дан 8 December 2019 в 04:32
поделиться

C++ не имеет "неопределенного" состояния для типов примитивов. Самым близким доступным для плавающего/двойного был бы NAN, но это действительно имеет другое значение.

1
ответ дан 8 December 2019 в 04:32
поделиться

Это не возможно в C/C++, примитивы всегда будут присвоенное значение (главным образом мусор, независимо от того, что было на том пятне в памяти перед ним, если явно не присвоено в объявлении). Я распространен, чтобы иметь значение заполнителя (т.е. 0 для указателей), который обозначает не - используемый, однако они должны быть явно присвоены также. Если Ваше двойное может взять какое-либо значение, то я предполагаю, что Вы помещаете булевскую переменную рядом с ним, присвоенный лжи первоначально и тесту/набору, что тот, когда Вы хотите сделать свое вычисление.

1
ответ дан 8 December 2019 в 04:32
поделиться

Необходимо сделать это при помощи дополнительной булевской переменной.

Для реализации использования дополнительной булевской переменной Вы могли попробовать логику как следующий шаблон:

template<typename T>
struct Defined
{
 bool defined;
 T value;
 Defined() : defined(false) {}
 Defined(const T& value_) : defined(true), value(value_) {}
 ... and perhaps other operators here ...
 ... to make this behave even more like a T ...
};
0
ответ дан 8 December 2019 в 04:32
поделиться

Вы могли попробовать Конструкцию на первой идиоме использования и записи get_bar() сюда:

double & get_bar()
{
    static double *bar = new double(something());
    return *bar;
}

Когда Вы звоните get_bar() это сделает bar для Вас, если никто еще не попросил его. Любые последующие вызовы просто возвратятся bar. Как связанная страница говорит, это технически не пропускает память, потому что ОС исправит ее, когда программа выйдет.

ОБНОВЛЕНИЕ:

Измененный возвращаемое значение на double & позволить Вам изменять bar.

0
ответ дан 8 December 2019 в 04:32
поделиться

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

Например:

Foo(): bar(-1)
{
}

Затем проверьте на значение -1 в get_bar функция.

(hmmm Laserallan также отправил тот ответ за 1 минуту до этого :-( ;-))

0
ответ дан 8 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: