Как определить наш собственный nullptr в С++ 98?

На самом деле я пишу свою собственную версию всех классов библиотеки и не хочу включать файлы STL в свой файл класса. Так, например, я хочу проверить, равен ли узел нулю. Если я напишу что-то вроде

#define nullptr 0

Тогда он не работает с каким-то другим указателем узла (например, Node *root = nullptr)


person ajithcpas    schedule 13.06.2017    source источник
comment
это с или с++? если это С++, то nullptr является ключевым словом   -  person codeconscious    schedule 13.06.2017
comment
Не спамьте тегами! С это не С++. И nullptr — это стандартное ключевое слово, введенное именно для того, чтобы избежать амбивалентного преобразования 0.   -  person too honest for this site    schedule 13.06.2017
comment
Если вы не добавите свою мотивацию, почему вам нужно это сделать, вам проголосуют против: nullptr был введен в язык, чтобы избежать случайной путаницы с нулем (из-за разрешения ADL и неявных преобразований типов). То, что вы предлагаете (определение), опасно и является источником ошибок, которые будет трудно найти. (по сути, вы повторно вводите в свою кодовую базу ошибки, вызванные NULL, и этот nullptr должен решить).   -  person utnapistim    schedule 13.06.2017


Ответы (2)


Как это сделать описано в книге: Effective C++, 2-е издание Скотт Мейерс (доступна более новая редакция) в главе: "Правило 25. Избегайте перегрузки указателя и числового типа".

Это необходимо, если ваш компилятор не знает ключевого слова nullptr, представленного C+. +11.

const                         /* this is a const object...     */
class nullptr_t
{
public:
   template<class T>          /* convertible to any type       */
   operator T*() const        /* of null non-member            */
      { return 0; }           /* pointer...                    */

   template<class C, class T> /* or any type of null           */
      operator T C::*() const /* member pointer...             */
      { return 0; }   

private:
   void operator&() const;    /* Can't take address of nullptr */

} nullptr = {};               /* and whose name is nullptr     */

Эту книгу определенно стоит прочитать.


Преимущество nullptr над NULL заключается в том, что nullptr действует как реальный тип указателя, поэтому он добавляет безопасность типов, тогда как NULL действует как целое число, просто установленное на 0 в pre C ++11.

person Andre Kampling    schedule 13.06.2017
comment
Вы должны вызвать тип nullptr_t, чтобы быть последовательным - person Passer By; 13.06.2017
comment
@PasserBy: Спасибо! Я изменил имя класса... Но экземпляр const всегда называется nullptr. - person Andre Kampling; 13.06.2017

Вы не должны определять макросы с идентификаторами, которые являются ключевыми словами.

Даже если вы не используете STL, нет необходимости определять свой собственный nullptr, потому что он не является частью STL (и стандартной библиотеки), а является частью самого языка (C++).

person eerorika    schedule 13.06.2017
comment
Это правда, но nullptr был добавлен только в C++11. Тем не менее, я не думаю, что это то, о чем этот вопрос. - person Ellis; 13.06.2017