c++无法为包含静态变量的对象设置NULL指针
C++ unable to set NULL pointer to static variable containing object?
提前道歉,因为我甚至不确定如何表达这个问题,但是我正在做一个家庭作业(这个问题与我在作业中遇到的问题无关),并遇到了某些问题(这只是一个提取和概括,我忽略了析构函数等):
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不是(?)
getFoo()->getID()在if(_id)上错误静态变量是否以某种方式阻止了指向该类类型的指针的NULL实例?我一开始问这个问题的原因是,当我在原始程序中注释掉静态变量行时,程序工作得很好。然而,在尝试了这段代码(或多或少地模拟了我正在做的事情)之后,删除静态变量行没有什么区别,它仍然会出现相同的错误。
这可能很简单,但我不知道出了什么问题。非常感谢您的帮助。
使用指针前检查。
int main()
{
Bar BAR;
Foo *pFoo = BAR.getFoo();
if (pFoo && pFoo->getID())
{
// do something
}
return 0;
};
您没有在任何地方创建Foo
实例,也没有将Foo*
传递给Bar
构造函数,因此Bar::_foo
初始化为NULL,这就是Bar::getFoo()
返回的内容。然后你的if
语句崩溃,由于你的反向使用短路逻辑(你试图访问Foo::getID()
之前,首先验证Bar::getFoo()
返回一个非null的Foo*
指针)。
必须将指向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; }
相关文章:
- 如何在自删除后将对象设置为nullptr
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- std::用派生类对象设置,但用gcc8.1设置基类比较器
- 如何在 gdb 中的所有构造函数上同时为 C++ 对象设置断点?
- 如何将C++ time_t对象设置为纪元?
- 使用PYBIND11,如何为Array_t对象设置基础内存的所有权
- 如何使用基类对象设置派生类变量的值
- C 不能将对象设置为方法的返回对象
- 一旦对象设置为 null,用于声明对象的堆大小的变量就设置为 null?
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 如何将2D向量中的对象设置为空指针[C ]
- 如何用类别的consumetrized构造函数声明使用类的比较对象设置的STL设置
- 为什么重载运算符不将主对象设置为值集
- 如何在 OpenGL 中为 3D 对象设置原点
- C++是否可以将fstream对象设置为在每次调用<<
- 如何从C#将对象设置为C++
- 哪个更好?如果子对象是类的成员,则为子对象设置父对象
- c++无法为包含静态变量的对象设置NULL指针
- 将数组中的对象设置为新对象
- 在OpenGL中为不同的对象设置单独的材质属性