我有一个基接口类:
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
答案 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)
您的示例代码没有任何问题(在编辑之后),问题必须在其他地方,例如失败的包含。