Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
#1

Взаимные include заголовочных файлов - C++

25.01.2013, 00:20. Просмотров 1134. Ответов 9
Метки нет (Все метки)

Доброго времени суток!

Возник вопрос по вот такой задаче: Пускай есть файлы A.h , A.cpp, B.h, B.cpp. В файле A.h объявлен класс А:
C++
1
2
3
4
5
6
7
8
class A
{
   ...
   B** Arr;
public:
   void someMethod();
   ...
};
В файле B.h класс B:

C++
1
2
3
4
5
6
class B
{
   ...
   friend void A::someMethod(); // Необходимо менять внутренние поля класса B из метода класса А
   ...
};
В файлах .cpp содержатся, соответственно, реализации классов A и B.

Как всю эту прелесть собрать теперь? Ставя #include соответствующих файлов, компилятор попытается включить каждый из .h файлов в каждый другой раньше использования определений, и уходит в бесконечность(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,945
Записей в блоге: 2
Завершенные тесты: 1
25.01.2013, 00:44     Взаимные include заголовочных файлов #2
Include guard
C++
1
2
3
4
#ifndef A_CLASS_H
#define A_CLASS_H
//код A
#endif
C++
1
2
3
4
#ifndef B_CLASS_H
#define B_CLASS_H
//код B
#endif
также можно
C++
1
#pragma once
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
25.01.2013, 00:44     Взаимные include заголовочных файлов #3
Код в хэдерах запихнуть в такое (для каждого хэдера свое имя LOL):
C++
1
2
3
4
#ifndef LOL
#define LOL
//код
#endif
Можно также попробовать написать 1вой строкой в каждом хэдере:
C++
1
#pragma once
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 00:51  [ТС]     Взаимные include заголовочных файлов #4
Shandr_71, Croessmah,

Беда в том, что так пробовал - не работает. В B.h пишет, что мол error C2653: 'A' : is not a class or namespace name,
а в A.h что error C2061: syntax error : identifier 'B'
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.01.2013, 00:58     Взаимные include заголовочных файлов #5
Oskard, Forward declaration пробовали?
C++
1
2
3
4
5
6
7
8
class B;
 
class A {
  
   // ...
   
   B ** b;
};
C++
1
2
3
4
5
6
7
#include "A.h"
 
class B {
 
   // ...
 
};
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,945
Записей в блоге: 2
Завершенные тесты: 1
25.01.2013, 00:59     Взаимные include заголовочных файлов #6
Цитата Сообщение от Oskard Посмотреть сообщение
Беда в том, что так пробовал - не работает. В B.h пишет, что мол error C2653: 'A' : is not a class or namespace name,
а в A.h что error C2061: syntax error : identifier 'B'
перед объявлением A поставьте
C++
1
class B;
перед объявлением B:
C++
1
class A;
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 01:07  [ТС]     Взаимные include заголовочных файлов #7
gray_fox, пробовал, заголовки собираются, но в реализации (.cpp файле A.cpp) в методах, использующих B** b, выдаётся ошибка: pointer to incomplete class type not allowed.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.01.2013, 01:09     Взаимные include заголовочных файлов #8
Oskard, включить B.h в A.cpp?
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 01:15  [ТС]     Взаимные include заголовочных файлов #9
gray_fox, да, это включение, при обёртке в Include guard заголовка класса A, помогло - программа собралась.


Спасибо всем!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2013, 01:17     Взаимные include заголовочных файлов
Еще ссылки по теме:

Правильное подключение заголовочных файлов C++
Подключение заголовочных файлов C++
Иерархия заголовочных файлов C++
Подключение заголовочных файлов и файлов реализации C++
C++ Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
25.01.2013, 01:17     Взаимные include заголовочных файлов #10
Цитата Сообщение от Oskard Посмотреть сообщение
при обёртке в Include guard заголовка класса A
Оборачивайте в них все заголовочные файлы.
Yandex
Объявления
25.01.2013, 01:17     Взаимные include заголовочных файлов
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru