現有兩個類,一個工做(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>函數