我正在尝试编写一个检查对象是否存在的函数:
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();
};
答案 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 to或point 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;
}
这样,在删除对象之前或创建新对象之前,您可以很好地控制对象是否存在。
希望这有帮助!