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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM