提前道歉,因为我甚至不确定如何说出这个问题,但我正在做一个家庭作业(问题是无关的,除了我遇到了工作中的问题)并且遇到了某些问题(这只是一个提取和概括,我遗漏了析构函数等等):
class idType {
int _id;
public:
int getID() { return _id; }
idType(int in = -1) : _id(-1) {}
};
class Foo {
static int _count;
idType* _id; //int wrapper just for examples sake
public:
Foo() { _id = new idType(_count); ++_count; }
idType* getID() { if(_id) return _id; return NULL; } //ERROR WHEN CALLED FROM BELOW
};
class Bar {
Foo* _foo;
public:
Bar(Foo* foo = NULL) : _foo(foo) {}
Foo* getFoo() { if(_foo) return _foo; return NULL; }
};
int foo::_count = 0;
int main() {
Bar BAR;
if(BAR.getFoo()->getID() && BAR.getFoo()); //RUN TIME ACCESS VIOLATION ERROR
return 0;
};
正如我所提到的,这不是我正在使用的代码,但我相信它可以更清楚地识别出正在发生的事情。 BAR传递了getFoo()检查,因此_foo不是(?)NULL但getFoo() - > getID()在if(_id)处出错。
静态变量是否会以某种方式阻止指向该类类型的指针的任何NULL实例? 我之所以这么说的原因是因为当我在原始程序中注释掉静态变量行时,程序运行正常。但是,在尝试此代码(或多或少模仿我正在做的事情)后,删除静态变量行没有任何区别,它仍然是错误的。
这可能很简单,但我对错误感到茫然。非常感谢您的帮助。
答案 0 :(得分:1)
在使用之前检查指针。
int main()
{
Bar BAR;
Foo *pFoo = BAR.getFoo();
if (pFoo && pFoo->getID())
{
// do something
}
return 0;
};
答案 1 :(得分:1)
您没有在任何地方创建Foo
实例,也没有将Foo*
传递给Bar
构造函数,因此Bar::_foo
初始化为NULL,这就是{{ 1}}返回。然后,由于您向后使用短路逻辑,您的Bar::getFoo()
语句崩溃(您在首次验证if
返回非NULL Foo::getID()
之前尝试访问Bar::getFoo()
指针)。
答案 2 :(得分:0)
您必须将指向Foo对象的指针传递给BAR
int main() {
Bar BAR(new Foo);
//Reverse the condition, check for pointer validity first
if(BAR.getFoo() && BAR.getFoo()->getID());
return 0;
};
提供析构函数以在使用后清理_foo
~Bar() { if(_foo) delete _foo; _foo=NULL; }