Проблема с заголовочными файлами - PullRequest
1 голос
/ 23 января 2010

У меня есть 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 ]

3 голосов
/ 23 января 2010

Вы можете объявить классы не заголовочные файлы.

Проблема с циклическими зависимостями обычно является признаком плохого дизайна. Вы хотите, чтобы 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 вы включаете их.

Имейте в виду, однако, что это имеет некоторые ограничения:

  • Вы можете использовать только объявленные классы для простых задач
  • вы не можете передавать их методам по значению, вы не можете сделать их членами классов

Как правило, , если размер перенаправленных классов необходим для компиляции данного фрагмента кода, вы не можете использовать форвард .

0 голосов
/ 23 января 2010

Я думаю, что вы говорите, что TaskModel.h включается вашим модулем более одного раза. Чтобы избежать этого, в верхней части «TaskModel.h» вы можете поместить:

#ifndef TASK_MODEL_H
#define TASK_MODEL_H

затем в конец файла ставим:

#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...