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>

posted @ 2019-03-15 18:58  cpluspluser  阅读(4730)  评论(0编辑  收藏  举报