В Type of query
выберите «Рабочие элементы и прямые ссылки», а в Type of links
выберите «Вернуть выбранные типы ссылок - дочерние».
Как другие ответы говорит, 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;
}
Как другие указали, нет ничего как "неопределенное" состояние. Но можно хотеть изучить boost.optional
Почему бы не поддержать отдельный флаг, который инициализируется ко лжи и затем установлен на истинный, когда панель вычисляется. Это может затем быть 'undefed' путем установки флага на ложь снова.
if(!isBarValid)
{
calculateBar();
isBarValid = true;
}
return bar;
Если Вы имеете в виду во времени выполнения, нет такой вещи. Если bar
никогда не инициализируется, это будет иметь любые случайные биты, оказывается, там, в зависимости от того, как объект выделяется (некоторые средства выделения инициализируют новую память, чтобы все-обнулить).
править: это до программиста для обработки объектного состояния в конструкторах и/или ручных методах инициализации как init()
C++ не имеет "неопределенного" состояния для типов примитивов. Самым близким доступным для плавающего/двойного был бы NAN, но это действительно имеет другое значение.
Это не возможно в C/C++, примитивы всегда будут присвоенное значение (главным образом мусор, независимо от того, что было на том пятне в памяти перед ним, если явно не присвоено в объявлении). Я распространен, чтобы иметь значение заполнителя (т.е. 0 для указателей), который обозначает не - используемый, однако они должны быть явно присвоены также. Если Ваше двойное может взять какое-либо значение, то я предполагаю, что Вы помещаете булевскую переменную рядом с ним, присвоенный лжи первоначально и тесту/набору, что тот, когда Вы хотите сделать свое вычисление.
Необходимо сделать это при помощи дополнительной булевской переменной.
Для реализации использования дополнительной булевской переменной Вы могли попробовать логику как следующий шаблон:
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 ...
};
Вы могли попробовать Конструкцию на первой идиоме использования и записи get_bar()
сюда:
double & get_bar()
{
static double *bar = new double(something());
return *bar;
}
Когда Вы звоните get_bar()
это сделает bar
для Вас, если никто еще не попросил его. Любые последующие вызовы просто возвратятся bar
. Как связанная страница говорит, это технически не пропускает память, потому что ОС исправит ее, когда программа выйдет.
ОБНОВЛЕНИЕ:
Измененный возвращаемое значение на double &
позволить Вам изменять bar
.
Инициализировать bar
к некоторому значению, которое никогда не может происходить, когда Вы звоните something()
функция в конструкторе.
Например:
Foo(): bar(-1)
{
}
Затем проверьте на значение -1
в get_bar
функция.
(hmmm Laserallan также отправил тот ответ за 1 минуту до этого :-( ;-))