在其他类中访问静态方法和静态bool

时间:2011-12-30 11:26:14

标签: c++ static

我有一个基接口类:

class A
{
public:
    ITask(){}
    virtual bool Start()=0;
    virtual void Update()=0;
    virtual void Stop()=0;
};

我现在有另外两个继承自

的类
#include "A.h"
#include "C.h"
class B: public A
{
public:
    bool Start(){} 
    void Update()
    {
        c.Start();
    } 
    void Stop(){}

    static bool m_run;

    static void SetRun(bool run)
    {
        m_run = run;
    }
private:
    C c;
};

最后我有第3课:

#include "A.h"
#include "B.h"
class C : public A
{
public:
    bool Start()
    {
        B::SetRun(false); // cant do this
        B::m_run = false; // or this
    }
    void Update()
    {

    }
    void Stop()
    {

    }
}

为简单起见,我已经删掉了一些代码。

我不明白为什么我无法访问B中的静态变量。我需要将它作为指针或参考吗?

我收到2个错误:

error C2653: 'B' : is not a class or namespace name
error C3861: 'm_run': identifier not found

2 个答案:

答案 0 :(得分:2)

虽然您没有显示,但我假设B.h包含C.h;否则行C c;将无法编译。这会导致头文件中出现循环依赖:B.h必须包含在C.h之前,B.h必须包含C::Start,这是不可能的。

最简单的解决方案是将C的正文移出C.h的定义,以便B.h不需要包含B。如果要将其保持内联,函数定义可以进入源文件或单独的标题。

或者,您可以修改std::unique_ptr<C>以包含C而不是new C的实例,并实现构造函数(在源文件中,或单独的标头中)以初始化它与B.h。然后class C;只需转发声明C.h而不是B.h

如果可能的话,更好的解决方案是重新考虑类之间的关系,以便不存在循环依赖。

(更新:当我写这个答案的时候,问题改为显示C.h确实包含{{1}},正如我猜测的那样。)

答案 1 :(得分:0)

您的示例代码没有任何问题(在编辑之后),问题必须在其他地方,例如失败的包含。