Как я могу проверить, существует ли объект в C ++ - PullRequest
14 голосов
/ 04 сентября 2010

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

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

Я довольно плохо знаком с C ++ и не уверен, что мой 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();

};

Ответы [ 4 ]

21 голосов
/ 04 сентября 2010

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

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

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.Связанная память автоматически очищается.

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

class UnloadingBay
{
   int foo;
   UnloadingShip unloadingShip;
};

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

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

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

, члены aBay создаются и живут так же долго, как и «aBay».

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

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

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

Удачи!

1 голос
/ 30 января 2012

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

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

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;
}

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

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

1 голос
/ 04 сентября 2010

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

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

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

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

1 голос
/ 04 сентября 2010

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

т.е.

SomeClass выгрузка корабля

против

SomeClass * выгрузка корабля

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