Можно ли установить объект на ноль? - PullRequest
34 голосов
/ 13 июня 2010

Далее в своем коде я проверяю, чтобы проверить, является ли объект пустым или пустым.

Есть ли способ установить нулевое значение для объекта?

Ответы [ 5 ]

42 голосов
/ 13 июня 2010

Объект класса не может быть установлен в 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;
8 голосов
/ 26 января 2018

Хотя верно, что объект не может быть «пустым / пустым» в C ++, в C ++ 17 мы получили std::optional для выражения этого намерения.

Пример использования:

std::optional<int> v1;      // "empty" int
std::optional<int> v2(3);   // Not empty, "contains a 3"

Затем вы можете проверить, содержит ли optional значение с

v1.has_value(); // false

или

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. Подробности смотрите в руководстве к вашему компилятору.

4 голосов
/ 13 июня 2010

Вы хотите проверить, является ли объект НЕДЕЙСТВИТЕЛЬНЫМ / пустым.Быть пустым и пустым - это не одно и то же.Как уже упоминали Джастин и Брайан, в C ++ NULL - это задание, которое вы обычно ассоциируете с указателями.Вы можете перегрузить оператор = возможно, но продумайте это очень хорошо, если вы действительно хотите это сделать.Пара других вещей:

  1. В C ++ указатель NULL сильно отличается от указателя, указывающего на «пустой» объект.
  2. Почему бы не использовать метод bool IsEmpty(), который возвращает значение true, если переменные объекта сбрасываются в состояние по умолчанию?Угадайте, что это может обойти использование NULL.
  3. Наличие чего-то вроде A* p = new A; ... p = NULL; - это плохо (без удаления p), если вы не можете гарантировать, что ваш код будет собирать мусор.Во всяком случае, это привело бы к утечкам памяти, и с несколькими такими утечками есть хороший шанс, что у вас будет медленный код.
  4. Вы можете сделать это class Null {}; Null _NULL;, а затем перегрузить operator = и operator! = Других классов в зависимости от вашей ситуации.

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

Arpan

3 голосов
/ 13 июня 2010

Вы можете установить любой указатель на NULL, хотя NULL просто определяется как 0 в C ++:

myObject *foo = NULL;

Также обратите внимание, что NULL определяется, если вы включаете стандартные заголовки, но не встроен в сам язык. Если NULL не определено, вы можете использовать 0 или включить это:

#ifndef NULL
#define NULL 0
#endif

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

0 голосов
/ 26 января 2018

"объект" какого типа?

Вы, безусловно, можете назначить NULLnullptr) для объектов типов указателей, и это зависит от реализации, если вы можете назначить NULL для объектов арифметических типов.

Если вы имеете в виду объекты некоторого типа класса, ответом будет NO (исключая классы, имеющие operator= принимающие указатели или арифметические типы)

"пусто" большеВероятно, так как многие типы имеют как назначение копирования, так и конструкцию по умолчанию (часто неявно).Чтобы увидеть, если существующий объект похож на созданный по умолчанию объект, вам также понадобится соответствующий bool operator==

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...