Как проверить, существует ли объект в С++

Я пытаюсь написать функцию, которая будет проверять, существует ли объект:

bool UnloadingBay::isEmpty() {
    bool isEmpty = true;
    if(this->unloadingShip != NULL) {
        isEmpty = false;
    }
    return isEmpty;
}

Я новичок в С++ и не уверен, что мой фон Java что-то путает, но компилятор дает ошибку:

UnloadingBay.cpp:36: error: no match for ‘operator!=’ in ‘((UnloadingBay*)this)->UnloadingBay::unloadingShip != 0’

Я не могу понять, почему это не работает.

Вот объявление для класса UnloadingBay:

class UnloadingBay {

    private:
        Ship unloadingShip;

    public:
        UnloadingBay();
        ~UnloadingBay();

        void unloadContainer(Container container);
        void loadContainer(Container container);
        void dockShip(Ship ship);
        void undockShip(Ship ship);
        bool isEmpty();

};

Ответы

Ответ 1

Похоже, вам может понадобиться учебник по понятию "переменная" на С++.

В С++ всякое время жизни переменной привязано к нему, охватывая область. Простейшим примером этого является локальная переменная функции:

void foo() // foo scope begins
{  
    UnloadingShip anUnloadingShip; // constructed with default constructor

    // do stuff without fear!
    anUnloadingShip.Unload();
} // // foo scope ends, anything associated with it guaranteed to go away

В приведенном выше коде "anUnloadingShip" по умолчанию создается при вводе функции foo (т.е. вводится ее область). Нет "нового". Когда охват охвата исчезает (в этом случае, когда foo выходит), ваш пользовательский деструктор автоматически вызывается для очистки UnloadingShip. Связанная память автоматически очищается.

Когда охватывающая область видимости является классом С++ (то есть переменной-членом):

class UnloadingBay
{
   int foo;
   UnloadingShip unloadingShip;
};

время жизни привязано к экземплярам класса, поэтому, когда наша функция создает "UnloadingBay"

void bar2()
{
    UnloadingBay aBay; /*no new required, default constructor called,
                         which calls UnloadingShip constructor for
                         it member unloadingShip*/

    // do stuff!
}  /*destructor fires, which in turn trigger member destructors*/

члены aBay строятся и живут до тех пор, пока живет "aBay".

Это все вычислено в время компиляции. Не существует подсчета ссылок во время выполнения, предотвращающих разрушение. Никаких соображений для чего-либо еще, что ссылается на или указывает на эту переменную. Компилятор анализирует функции, которые мы написали, чтобы определить область действия и, следовательно, время жизни переменных. Компилятор видит, где заканчивается область переменных, и все необходимое для очистки этой переменной будет вставлено во время компиляции.

"новый", "NULL", (не забывайте "удалить" ) в С++ приходят в игру с указателями. Указатели - это тип переменной, которая содержит адрес памяти некоторого объекта. Программисты используют значение "NULL", чтобы указать, что указатель не содержит адрес (то есть он не указывает ни на что). Если вы не используете указатели, вам не нужно думать о NULL.

До тех пор, пока вы не освоитесь с тем, как переменные на С++ входят и выходят из области действия, избегайте указателей. Это еще одна тема.

Удачи!

Ответ 2

Я предполагаю, что unloadingShip - это объект, а не указатель, поэтому значение никогда не может быть NULL.

т.

SomeClass unloadingShip

против

SomeClass * unloadingShip

Ответ 3

Ну, вам не нужно писать столько кода, чтобы проверить, является ли указатель NULL или нет. Метод может быть намного проще:

bool UnloadingBay::isEmpty() const {
    return unloadingShip == NULL;
}

Кроме того, он должен быть помечен как "const", потому что он не изменяет состояние объекта и может быть вызван также в постоянных экземплярах.

В вашем случае "unloadingShip" - это объект класса "UnloadingShip", который не динамически распределяется (за исключением случаев, когда весь класс "Разгрузочный байк" распределяется динамически). Таким образом, проверка, если она равна NULL, не имеет смысла, поскольку она не является указателем.

Ответ 4

Для проверки, если объект существует, вы можете рассмотреть этот путь следующим образом:

создайте указатель на свой объект:

someClass *myObj = NULL // Make it null

и теперь, когда вы передаете этот указатель, вы можете проверить:

if(!myObj)  // if its set null, it wont pass this condition
    myObj = new someClass();

а затем, если вы хотите удалить, вы можете сделать это:

if(myobj)
{
    delete myObj;
    myObj = NULL;
}

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

Надеюсь, это поможет!