访问其他类中的静态方法和静态布尔值

Accessing Static Method and Static bool in other class

本文关键字:静态 布尔值 静态方法 其他 访问      更新时间:2023-10-16

>我有一个基接口类:

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

我现在有另外 2 个类,它们继承自此

#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;
};

最后我有一个第三类:

#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

虽然你没有显示它,但我假设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

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