Как проверить нулевой класс в C ++ - PullRequest
1 голос
/ 22 июня 2011

Как проверить, является ли класс пустым или нет в C ++? Предположим, у меня есть класс Line:

Line line[1000];

if (line[0] == NULL)
   cout << "NULL";
else
   cout << "NOT NULL";

Я получаю это сообщение об ошибке:

нет совпадения для 'operator =' в 'строке [i] = 0'

Ответы [ 7 ]

9 голосов
/ 22 июня 2011

Я предполагаю, что вы из .NET или Java фона.Объект типа класса не может быть NULL в C ++.Если бы вы сохранили массив указателей на строку, это было бы другим делом, и ваш синтаксис был бы действительным.

Теперь, если у вас есть своя собственная семантика того, что такое NULL-строка, вы можете

  • реализовать функцию-член с именем IsNull()
  • Перегрузить operator void* и чек if(Lines[i])
5 голосов
/ 22 июня 2011

код

Line line[1000];

создает 1000 объектов Line и сохраняет их в массиве строк. Проверка на NULL не имеет смысла. Вы можете определить

Line* line[1000];

В этом случае вам нужно инициализировать массив, и ваш тест будет работать.

1 голос
/ 22 июня 2011

Строка не указатель. Всякий раз, когда вы пишете. Line line[1000];

1000 of line get allocated. 

Так что после этой строки не будет NULL.

1 голос
/ 22 июня 2011

Ваш класс Line не равен NULL.У вас есть 1000 экземпляров Line, созданных конструктором по умолчанию.Возможно, вы могли бы проверить NULL, используя Line & operator == (const int ) const, а затем сравнить некоторые внутренние члены, но это странно, если бы вы делали это так.

1 голос
/ 22 июня 2011

Указатель на экземпляр может быть NULL, а не на экземпляр класса.

0 голосов
/ 22 июня 2011

Чтобы ответить на ваш вопрос, line[0] имеет тип Line&, который можно прочитать как reference to a Line object. В C ++ ссылки не могут быть NULL.

Сообщение об ошибке в вашем вопросе похоже на строку кода, которую вы не опубликовали. Я могу только предположить, основываясь на сообщении об ошибке, что вы пытаетесь присвоить значение 0 объекту строки, расположенному в индексе i. Поскольку оператор = не перегружен в вашем классе Line, компилятор не может разрешить разницу в типах.

0 голосов
/ 22 июня 2011

Раздел 5.17 стандарта ISO гласит

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

Это потому, что перегруженный оператор для '=' не соответствует ни одному из предоставленных вами перегруженных экземпляров.

Вам нужно инициализировать его как Line *, а не просто Line, и он должен работать. Лучше, если вы перегрузите void * (например, new).

...