在派生类中分配时,基类中的静态成员为null

时间:2012-11-30 02:03:13

标签: c++ inheritance static

我有一个带有静态指针成员的基类。当我在派生类中分配该静态指针成员时,该静态成员在从基类的方法引用时显示为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();
}

4 个答案:

答案 0 :(得分:2)

你的编译器显然是这里的问题,我并不感到惊讶,因为它允许两者

int main(int argc, void *argv[])

Derived derived = new Derived();

例如,请参阅the result in ideonestatic成员应明确为空。

答案 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有用的原因,让像我这样的人做出毫无根据的猜测。