头文件的问题

时间:2010-01-23 16:54:07

标签: c++ header

我在项目中有3个头文件:Form1.h - 这是带有实现的头,TaskModel.h有TaskModel.cpp,TaskController.h有TaskController.cpp。

有文件内容:

//-----
TaskController.h

#pragma once
#include "TaskModel.h"
..........



//----
Form1.h
#pragma once
#include "TaskModel.h"
#include "TaskController.h"
.........

问题:

如何将Form1.h包含在TaskModel.h中。当我直接将Form1.h包含在TaskModel.h中时,会出现很多错误。如果要使用前向声明,如何组织它?

2 个答案:

答案 0 :(得分:3)

您可以转发声明而不是头文件。

循环依赖的问题通常是糟糕设计的标志。你想让TaskModel.h包含Form1.h吗?这是为什么?可以避免吗?难道你不能将Form1.h包含在TaskModel.cpp中吗?

对于前瞻性声明:

// in TaskModel.h

class Form1; // or other classes that are using in TaskModel.h

//... task model code

// in TaskModel.cpp

#include "Form1.h"

基本上你在这里做的是声明存在这样的类。然后在cpp文件中包含它们。

请注意,这有一些限制:

  • 您只能将前向声明的类用于简单任务
  • 你不能将它们传递给每个值的方法,你不能使它们成为类的成员

根据经验,如果需要转发的类大小来编译给定的代码段,则不能使用转发

答案 1 :(得分:-1)

我认为你说你的模块不止一次包含“TaskModel.h”。为了避免这种情况,可以在“TaskModel.h”的顶部放置:

#ifndef TASK_MODEL_H
#define TASK_MODEL_H

然后在文件的末尾放置:

#endif