如何检查C ++中是否存在对象

时间:2010-09-04 03:10:58

标签: c++ compiler-construction

我正在尝试编写一个检查对象是否存在的函数:

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 个答案:

答案 0 :(得分:21)

听起来你可能需要在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

在上面的代码中,当输入函数foo(即输入其范围)时,默认构造“anUnloadingShip”。不需要“新”。当包含范围消失时(在这种情况下当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的成员就会被建造和生存。

这完全是在编译时中计算出来的。没有运行时引用计数防止破坏。不考虑可能refer topoint to该变量的任何其他内容。编译器分析我们编写的函数,以确定变量的范围,从而确定变量的生命周期。编译器会看到变量的作用域结束的位置,清理该变量所需的任何内容都将在编译时插入。

C ++中的“新”,“NULL”,(不要忘记“删除”)与指针一起发挥作用。指针是一种变量,它包含某个对象的内存地址。程序员使用值“NULL”来指示指针不包含地址(即它不指向任何东西)。如果您没有使用指针,则无需考虑NULL。

在掌握C ++中的变量如何进入和超出范围之前,请避免使用指针。这完全是另一个话题。

祝你好运!

答案 1 :(得分:1)

我假设unloadingShip是一个对象而不是一个指针,因此该值永远不会为NULL。

即。

SomeClass unloadingShip

SomeClass * unloadingShip

答案 2 :(得分:1)

好吧,您不必编写太多代码来检查指针是否为NULL。这种方法可以简单得多:

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

另外,它应该标记为“const”,因为它不会修改对象的状态,也可以在常量实例上调用。

在您的情况下,“unloadingShip”是类“UnloadingShip”的对象,它不是动态分配的(除非动态分配整个类“UnloadingBay”)。因此,检查它是否等于NULL没有意义,因为它不是指针。

答案 3 :(得分:1)

为了检查,如果存在对象,您可以考虑采用这种方式:

创建指向对象的指针:

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

这样,在删除对象之前或创建新对象之前,您可以很好地控制对象是否存在。

希望这有帮助!