相互インクルード対策

C++ を使っていて、相互にインクルードしなければならない状況が起きた。

相互にインクルードするとたくさんエラーが出たので片方を抜いた。
そうすると、片方は定義されておらずもう片方が多重定義、みたいな状態に。
Task.h taskQueue.h 以外にもソースファイルがあるので、それらも関係して多重定義担っている模様。

In file included from taskQueue.h:1,
from Run.h:2,
from Run.cc:5:
Task.h:24: error: ‘taskQueue’ has not been declared
In file included from Run.h:2,
from Run.cc:5:
taskQueue.h:5: error: expected unqualified-id before ‘[’ token
In file included from Run.cc:6:
Task.h:4: error: redefinition of ‘class Task’
Task.h:5: error: previous definition of ‘class Task’


修正前

taskQueue.h

#include "Task.h"

class taskQueue
{
Task task;
}


Task.h

#include "taskQueue"

class Task
{
taskQueue task_list;
}


と言った感じ。
どうにもエラーが取れないので、いつも通り Google 先生にお伺いを立てる。

こういったページを見つけた。
<http://d.hatena.ne.jp/arvitos/20090213/1234519302>

これを解決するには、前方宣言という方法を使う必要があるらしい。
という訳で、上の2つのファイルを修正。

修正後

taskQueue.h

class Task;
class taskQueue
{
Task task;
}


Task.h

class taskQueue;
class Task
{
taskQueue task_list;
}


これでエラーを取ることができた。
C++ は Java の知識そのままで触ったら大変なことになるなぁ。

追記 インクルードガード


多重にインクルードすることを防ぐ方法もあります。
.h ファイルの冒頭に

#ifndef ABCDE
#define ABCDE

#endif


みたいに書くと多重インクルードを防げます。

コメント

このブログの人気の投稿

make error "Circular"

gdb操作