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

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

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

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

25.01.2013, 00:20. Просмотров 1268. Ответов 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 файлов в каждый другой раньше использования определений, и уходит в бесконечность(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2013, 00:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Взаимные include заголовочных файлов (C++):

Про добавление заголовочных файлов в заголовочных файлах - C++
В который раз эта вещь засовывает мозги в блендер! Я про то, что не могу однозначно запомнить (основываясь на моих знаниях о директиве...

Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации) - C++
Почему во многих учебниках функции-члены класса внутри класса только объявляют, но определяют вне самого класса (не, ну как бы в классе, но...

Подключение заголовочных файлов и файлов реализации - C++
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add class все работает,для примера написал...

Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h> - C++
В типизированном файле записаны названия городов и их численность. Увеличить численность каждого города на 5% (Количество жителей всегда...

Иерархия заголовочных файлов - C++
Вопрос такой. Есть 2 заголовочных файла с классами: core.h interface.h В core.h происходит #include interface.h В...

Подключение заголовочных файлов - C++
Здравствуйте. Возникают ошибки при компиляции проекта: 1. Указывает на указатель: 2. Указывает на указатель и коллекцию указателей: ...

9
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
25.01.2013, 00:44 #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
0
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
25.01.2013, 00:44 #3
Код в хэдерах запихнуть в такое (для каждого хэдера свое имя LOL):
C++
1
2
3
4
#ifndef LOL
#define LOL
//код
#endif
Можно также попробовать написать 1вой строкой в каждом хэдере:
C++
1
#pragma once
1
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 00:51  [ТС] #4
Shandr_71, Croessmah,

Беда в том, что так пробовал - не работает. В B.h пишет, что мол error C2653: 'A' : is not a class or namespace name,
а в A.h что error C2061: syntax error : identifier 'B'
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.01.2013, 00:58 #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 {
 
   // ...
 
};
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
25.01.2013, 00:59 #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;
1
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 01:07  [ТС] #7
gray_fox, пробовал, заголовки собираются, но в реализации (.cpp файле A.cpp) в методах, использующих B** b, выдаётся ошибка: pointer to incomplete class type not allowed.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.01.2013, 01:09 #8
Oskard, включить B.h в A.cpp?
1
Oskard
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 4
25.01.2013, 01:15  [ТС] #9
gray_fox, да, это включение, при обёртке в Include guard заголовка класса A, помогло - программа собралась.


Спасибо всем!
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
25.01.2013, 01:17 #10
Цитата Сообщение от Oskard Посмотреть сообщение
при обёртке в Include guard заголовка класса A
Оборачивайте в них все заголовочные файлы.
0
25.01.2013, 01:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2013, 01:17
Привет! Вот еще темы с ответами:

Отличие заголовочных файлов - C++
чем отличается string.h cstring string

Подключение заголовочных файлов - C++
Начал изучать С++, скачал несколько книг и заметил что в одних при включении заголовочных файлов (например iostream.h) используется запись:...

Подключение заголовочных файлов - C++
Итересует меня вопрос : нужно ли при компиляции программ оставлять только нужные хэдеры ? т.е. их минимальное кол-во для корректной...

Подключение заголовочных файлов. - C++
У меня есть заголовочный файл: ...\1\2\file.h. в папке &quot;1&quot; есть file2.h. Как подключить к &quot;file.h&quot; &quot;file2.h&quot;?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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