4 / 4 / 3
Регистрация: 04.10.2009
Сообщений: 202
1

Правильная работа с заголовочными файлами

13.08.2019, 18:25. Показов 330. Ответов 2
Метки нет (Все метки)

Добрый день! Данная тема неоднократно подымалась на форуме, но конкретно для моей ситуации ответ увы найти не удалось.
Суть проблемы, есть у нас два файла A.h и B.h
A.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
#ifndef A_H
#define A_H
include "B.h"
class A
{
public:
B b;
};
#endif
B.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
#ifndef B_H
#define B_H
include "A.h"
class B
{
public:
A a;
};
#endif
В результате компиляции мы получим примерно следующую ошибку "build errors due to circular dependency amongst classes" или компилятор просто не обнаружит тип "А". Причина её возникновения мне понятна, но хотелось бы понять как правильно данная проблема решается ? Или здесь больше проблема в самой структуре написанного кода и на практике мы должны исключать подобную ситуацию т.к. в двух классах не должно быть взаимного включения объектов друг друга ? Знаю пару решений для данной проблемы к примеру добавив в файл A.h объявления класса B тем самым избавившись от не нужного заголовка.
C++ (Qt)
1
class B;
Но подобное решение вовсе не красит код и хотелось бы узнать как правильно выходить из подобной ситуации.
Буду весьма признателен за помощь!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2019, 18:25
Ответы с готовыми решениями:

Работа с заголовочными файлами
Приветствую! Простейшая программа с подключением заголовочного файла выдаёт следующие ошибки: ...

Ошибка с заголовочными файлами
error C1014: слишком много включаемых файлов: глубина = 1024

Непонятка с заголовочными файлами
game.h #ifndef _GAME_H_ #define _GAME_H_ #include <gl\gl.h> #include <gl\glu.h> ...

В чем разница между заголовочными файлами и библиотеками
В чем разница между заголовочными файлами и библиотеками? И, вообще, какова структура библиотеки в...

2
168 / 144 / 25
Регистрация: 13.08.2019
Сообщений: 560
13.08.2019, 18:53 2
Компилятор сообщает Вам о круговой зависимости между классами, что вполне корректно ввиду подобной реализации.
Объявлять объект одного класса внутри описания другого класса неправильно с точки зрения логики. Класс - это описание конкретного объекта с его полями и методами. Вы можете разрешить пользоваться методами одного класса другому через дружественность:-). Видимость полей так же можно настроить, чтобы один класс имел доступ к полям другого класса. Однако, в последнем случае Вы потеряете инкапсуляцию, так что тут будьте внимательны.
Создавайте два отдельных класса с их полями и методами и пользуйтесь в основной программе.
Либо внесите ясность, какую идею Вы преследуете, когда объявляете объекта одного класса внутри другого.
1
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
13.08.2019, 20:52 3
serega721, циклической зависимости между классами быть не может.
Для любого типа необходима возможность вычислить его размер, а с такой связью, как у Вас, выходит бесконечный размер.

Обычно делают так:
C++
1
2
3
4
5
6
7
8
class B;
class A{
   B* ptr;
}
 
class B{
   A field;
}
Так же можно использовать ссылки, умные указатели, всякие коллекции.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2019, 20:52

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Создание статической библиотеки из нескольких файлов с несколькими заголовочными файлами
В общем, имеется несколько классов, как водится - каждый имеет .h/.cpp. Решил собрать все это дело...

Как пользоваться заголовочными файлами и использовать несколько исходных файлов?
Как пользоваться несколькими файлами cpp, и заголовками h , в Visual Studio WIN32 C++ Дайте...

Правильная работа с файлами
Я написал небольшой скрипт, который разбирает текстовый файл со строками (разделенными табуляциями)...

Правильная работа с БД
У меня есть небольшое приложение в котором реализованы функции выборки данных из БД (select ...),...


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

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

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