我有一个带有静态指针成员的基类。当我在派生类中分配该静态指针成员时,该静态成员在从基类的方法引用时显示为NULL。
这不是我期望的行为。无论从何处访问静态指针成员,它都不应该被分配?我对预期的行为有误吗?
静态成员是指向基类的指针。我意识到我想要实现的目标可能最好通过使用模板(Static polymorphism definition and implementation)的静态多态来实现,但我仍然不明白为什么在这种情况下指针成员本身是NULL。
编辑:此SSCE中未演示此行为。什么错误或常见错误会导致我描述的行为?我的实际生产场景比这复杂得多,但结构几乎完全相同。我确实在VS2010调试器中观察Base::staticMember == not null
,然后调用Base::staticMethod()
,而在Base::staticMethod()
内,Base::staticMember
为空。我很困惑。
#include <iostream>
class Base {
public:
static Base *staticMember;
static void baseMethod();
};
Base *Base::staticMember = NULL;
class Derived : public Base {
public:
void derivedMethod();
};
void Base::baseMethod() {
// here staticMember == NULL, the unexpected behavior
if(staticMember == NULL) {
std::cout << "NULL";
} else {
std::cout << "NOT NULL";
}
};
void Derived::derivedMethod() {
staticMember = new Derived();
}
int main(int argc, void *argv[]) {
Derived *derived = new Derived();
derived->derivedMethod();
Base::baseMethod();
}
答案 0 :(得分:2)
你的编译器显然是这里的问题,我并不感到惊讶,因为它允许两者
int main(int argc, void *argv[])
和
Derived derived = new Derived();
例如,请参阅the result in ideone。 static
成员应明确不为空。
答案 1 :(得分:1)
对代码的修复版本和简化版本没有重复:
#include <iostream>
#include <iomanip>
struct Base {
static Base* staticMember;
static void baseMethod();
};
Base* Base::staticMember;
void Base::baseMethod() {
std::cout << std::boolalpha << (staticMember == nullptr) << std::endl;
}
struct Derived : Base {
void derivedMethod();
};
void Derived::derivedMethod() {
staticMember = this;
}
int main() {
Derived derived;
derived.derivedMethod();
Base::baseMethod();
}
打印“false”。
始终提供Short, Self Contained, Correct (Compilable), Example,否则您的问题毫无意义。
答案 2 :(得分:0)
如前所述,SSCE有效,但您的产品代码却没有。如果您做出如下更改:
void Derived::derivedMethod()
{
Base::staticMember = new Derived();
}
这明确地告诉编译器你正在谈论什么变量,并且可能会抛出你不小心隐藏基础成员的情况。
(我认为gcc可能需要Base::staticMember
- 可能不是在这个确切的情况下)
答案 3 :(得分:0)
也许你不小心宣布了 class Derived { static Base * staticMember; };
所以你有两个静态会员。
这就是SSCE有用的原因,让像我这样的人做出毫无根据的猜测。