C++类循环引用的问题
现有两个类,一个工作(Work)类,一个状态(State)类。
<pre><code class="language-cpp line-numbers">class Work
{
public:
Work();
~Work();
double GetHour();
private:
double m_hour;
State* m_current;
};
</code></pre>
<pre><code class="language-cpp line-numbers">class State
{
public:
State();
~State();
virtual void WriteProgream(Work w) = 0;
};
</code></pre>
在State类中,只有一个pure virtual函数,其中需要一个Work参数。而在Work类中,需要一个State成员变量来表示当前的工作状态。
这里若是直接在Work中包含State中头文件,在State中包含Work的头文件,是不能通过编译的:
<pre><code class="language-cpp line-numbers">#pragma once
#include "State.h"
class Work
{
public:
Work();
~Work();
double GetHour();
private:
double m_hour;
State* m_current;
};
</code></pre>
<pre><code class="language-cpp line-numbers">#pragma once
#include "Work.h"
class State
{
public:
State();
~State();
virtual void WriteProgream(Work w) = 0;
};
</code></pre>
会产生以下Error:
<img src="https://i.loli.net/2018/10/01/5bb224b92dbcb.jpg" alt="blob.jpg">
这种互相调用的关系很难存在,Work中调用State,State中调用Work.....,如同死循环。因而一般来说,在这两者中至少需要一方是使用指针,或者皆为指针,不能同时都定义实体对象。
解决的方法是:在二者之一的类中包含另一个的头文件,另一个头文件采用class xxx;的方式声明,并在cpp文件中包含头文件。
<pre><code class="language-cpp line-numbers">//Work.h
#pragma once
#include "State.h"
class Work
{
public:
Work();
~Work();
double GetHour();
private:
double m_hour;
State* m_current;
};
</code></pre>
<pre><code class="language-cpp line-numbers">//State.h
#pragma once
class Work;
class State
{
public:
State();
~State();
virtual void WriteProgream(Work w) = 0;
};
//State.cpp
#include "State.h"
#include "Work.h"
State::State()
{
}
State::~State()
{
}
void State::WriteProgream(Work w)
{
}
</code></pre>