0

我有一个带有静态指针成员的基类。当我在派生类中分配该静态指针成员时,该静态成员在从基类的方法引用时显示为 NULL。

这不是我所期望的行为。无论从哪里访问静态指针成员,不应该仍然分配它吗?我对预期的行为有误吗?

静态成员是指向基类的指针。我意识到我想要实现的目标可能最好通过使用模板的静态多态性(静态多态性定义和实现)来完成,但我仍然不明白为什么在这种情况下指针成员本身为 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

4 回答 4

2

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

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

Derived derived = new Derived();

例如,查看ideone 中的结果。该static成员显然不应为空。

于 2012-11-30T02:07:49.920 回答
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();
}

打印“假”。

总是给出一个简短的、独立的、正确的(可编译的)示例,否则你的问题毫无意义。

于 2012-11-30T02:13:53.863 回答
0

也许你不小心声明了 class Derived { static Base *staticMember; };

所以你有两个 staticMember 漂浮在周围。

这就是为什么 SSCE 很有用,可以防止像我这样的人做出毫无根据的猜测。

于 2012-11-30T04:17:35.757 回答
0

如前所述,SSCE 有效,但您的产品代码无效。如果您进行如下更改:

void Derived::derivedMethod() 
{
    Base::staticMember = new Derived();
}

这明确地告诉编译器您在谈论什么变量,并且可能会引发您不小心隐藏基成员的情况。

(我认为 gcc 可能需要Base::staticMember- 在这种情况下可能不需要)

于 2012-11-30T03:05:25.990 回答