Далее в своем коде я проверяю, является ли объект нулевым / пустым.
Есть ли способ установить для объекта значение null?
Далее в своем коде я проверяю, является ли объект нулевым / пустым.
Есть ли способ установить для объекта значение null?
Объект класса не может быть установлен в NULL; однако вы можете установить указатель (который содержит адрес в памяти объекта) в NULL.
Пример того, что вы не можете сделать, о чем спрашиваете:
Cat c;
c = NULL;//Compiling error
Пример того, что вы можете сделать:
Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
Cat::operator=(...)
. В любом случае, похоже, OP действительно хочет проверить указатель. Итак, +1.
- person jweyrich; 13.06.2010
nullptr
включать не нужно, это ключевое слово.
- person Baum mit Augen; 26.01.2018
cstddef
необходим для хеш-определения NULL
, которое является константой нулевого указателя, определенной реализацией.
- person wulfgarpro; 27.01.2018
Хотя верно, что объект не может быть "пустым / нулевым" в C ++, в C ++ 17 мы получили _ 1_, чтобы выразить это намерение.
Пример использования:
std::optional<int> v1; // "empty" int
std::optional<int> v2(3); // Not empty, "contains a 3"
Затем вы можете проверить, содержит ли optional
значение с
v1.has_value(); // false
or
if(v2) {
// You get here if v2 is not empty
}
Однако простой int
(или любой тип) никогда не может быть "нулевым" или "пустым" (по вашему определению этих слов) в каком-либо полезном смысле. Думайте о std::optional
как о контейнере в этом отношении.
Если у вас нет компилятора, совместимого с C ++ 17, вы можете использовать boost.optional. Некоторые компиляторы до C ++ 17 также предлагают std::experimental::optional
, который будет вести себя, по крайней мере, близко к фактическому std::optional
afaik. За подробностями обращайтесь к руководству вашего компилятора.
std::experimental::optional
, если это предусмотрено вашим компилятором.
- person Jonathan Wakely; 26.01.2018
Вы можете установить любой указатель на NULL
, хотя NULL
просто определяется как 0 в C ++:
myObject *foo = NULL;
Также обратите внимание, что NULL
определяется, если вы включаете стандартные заголовки, но не встроен в сам язык. Если NULL
не определено, вы можете использовать 0 вместо этого или включить это:
#ifndef NULL
#define NULL 0
#endif
Кстати, если вы действительно хотите установить объект, а не указатель, на NULL
, вы можете прочитать о Шаблон "Нулевой объект".
Вы хотите проверить, является ли объект NULL / пустым. Быть NULL и пустым - это не одно и то же. Как уже упоминали Джастин и Брайан, в C ++ NULL - это присвоение, которое вы обычно связываете с указателями. Вы можете перегрузить operator = возможно, но хорошо подумайте, если вы действительно хотите это сделать. Еще пара вещей:
bool IsEmpty()
метод, который возвращает истину, если переменные объекта сброшены в какое-то состояние по умолчанию? Угадайте, что это могло бы обойти использование NULL.A* p = new A; ... p = NULL;
- это плохо (без удаления p), если вы не можете гарантировать, что ваш код будет собран сборщиком мусора. Во всяком случае, это привело бы к утечкам памяти, а при нескольких таких утечках велика вероятность, что у вас будет медленный код.class Null {}; Null _NULL;
, а затем перегрузить operator = и operator! = Других классов в зависимости от вашей ситуации.Возможно, вам стоит опубликовать нам некоторые подробности о контексте, чтобы помочь вам лучше выбрать вариант 4.
Арпан
boost::optional<T>
, чтобы указать, есть ли у вас действительный объект T. Это предотвратит вызов x.foo()
, когда x.IsEmpty()==true
- person MSalters; 14.06.2010
"объект" какого типа?
Вы, конечно, можете назначать NULL
(и nullptr
) объектам типов указателей, и это определяется реализацией, если вы можете назначать NULL
объектам арифметических типов.
Если вы имеете в виду объекты какого-либо типа, ответ - НЕТ (за исключением классов, имеющих operator=
принимающий указатель или арифметические типы).
"empty" более правдоподобен, поскольку многие типы имеют как присваивание копии, так и конструкцию по умолчанию (часто неявно). Чтобы проверить, похож ли существующий объект на созданный по умолчанию, вам также понадобится соответствующий bool operator==