Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/58: Рейтинг темы: голосов - 58, средняя оценка - 4.74
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122

Трудности с include

16.09.2010, 13:28. Показов 11561. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Есть два класса, 1 описан в header1.h, второй в header2.h. Во втором классе нужно использовать экземпляр первого и наоборот в первом эклемпляр второго...

Чтобы это получилось, пишу в header1.h
C++
1
#include "header2.h"
, в header2.h пишу:
C++
1
#include "header1.h"
Компилятор C++ Builder 2010 пишет ошибку:
[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Я так понимаю, при инклуде получается бесконечный цикл...

Кто знает, как реализовать взаимный include? (друг на друга)...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2010, 13:28
Ответы с готовыми решениями:

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

#include<iostream>// подключение библиотек #include <conio.h> #include <climits>
помогите для этой программы сделать блок-схему. Пожалуйста #include&lt;iostream&gt;// подключение библиотек #include &lt;conio.h&gt; ...

Чем отличается #include <cstring>, #include <string> и #include <string.h>?
Доброго времени суток :) Пишу свой класс и мне для нужны функции для работы со строками. Когда подключаю #include &lt;string&gt; все...

16
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 13:56
davian, Стражи в хедерах поставлены?
Либо #pragma once в каждом,
либо
обычный страж в каждом хедере
1
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:00  [ТС]
Цитата Сообщение от Lavroff Посмотреть сообщение
davian, Стражи в хедерах поставлены?
Либо #pragma once в каждом,
либо
обычный страж в каждом хедере
Тут поподробнее... Что это такое и с чем ЕГО едят....
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:02
davian, Страж включения позволяет включать один и тот же хедер несколько раз в проекте. Обычный страж выглядит так, для файла header.
C++
1
2
3
4
#ifndef _HEADER_H_
#define _HEADER_H_
//Код
#endif
Собственно приспособьте под свои и попробуйте.
1
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:20  [ТС]
Теперь ошибки другие полезли:
[BCC32 Error] SWindows.h(21): E2303 Type name expected;
[BCC32 Error] SWindows.h(21): E2139 Declaration missing ;
1-й header (SWindows.h) полный код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef SWindowsH
#define SWindowsH
//---------------------------------------------------------------------------
 
//******include from outside:
#include <vcl.h>
//******include from project:
#include "XWindow.h"
 
 
class SWindows
{
private:
    bool        FIsError;
    UnicodeString   FErrMessage;
 
    XWindow *FWindows[4]; //тут ошибка
    
    unsigned short  FNumWindow;
    unsigned short  FCount;
 
    TComponent  *FParent;
 
    
protected:
public:
    __fastcall  SWindows(TComponent* Owner);
    __fastcall  ~SWindows();
 
    void __fastcall             AddWindow();
    void __fastcall         PlaceWindow();
    void __fastcall         DeleteWindow(int Num);
 
    __property unsigned short   NumWindow = {read = FNumWindow};
    __property unsigned short   Count = {read = FCount};
    __property bool             IsError = {read = FIsError, write = FIsError};
    __property UnicodeString    ErrMessage = {read = FErrMessage, write = FErrMessage};
    __property TComponent       *ParentWindow = {read = FParent};
};
 
#endif
2-й header (XWindow.h) код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef XWindowH
#define XWindowH
//---------------------------------------------------------------------------
 
//******include from outside:
#include <vcl.h>
#include <gdiplus.h>
//******include from project:
#include "SWindows.h"
 
 
class XWindow : public TScrollBox
{
        typedef TScrollBox Inherited;
private:
    
    SWindows*       FWindows;//указатель на головной класс
 
    TCheckBox       *Selected;
    unsigned int        FNumber;
 
protected:
    
 
public:
    
 
    __fastcall XWindow(TComponent* Owner);
    __fastcall ~XWindow();
 
    
};
 
#endif
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:25
davian, я вам разве так говорил включать? Поменяйте.

C++
1
2
#ifndef SWindowsH
#define SWindowsH
на

C++
1
2
#ifndef _SWINDOWS_H_
#define _SWINDOWS_H_
и
C++
1
2
#ifndef XWindowH
#define XWindowH
на

C++
1
2
#ifndef _XWINDOW_H_
#define _XWINDOW_H_
1
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:29  [ТС]
та же самая ошибка...
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:30
Видимо не в этом было дело... Текст ошибки в студию.

[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Эта ошибка вообще не понятна, ибо я просто не вижу у вас такого файла. Или это Xwindow теперешний?
0
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:32  [ТС]
Цитата Сообщение от Lavroff Посмотреть сообщение
Видимо не в этом было дело... Текст ошибки в студию.

[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Эта ошибка вообще не понятна, ибо я просто не вижу у вас такого файла. Или это Xwindow теперешний?
Речь не об этой ошибке...

Ошибка:

[BCC32 Error] SWindows.h(21): E2303 Type name expected
[BCC32 Error] SWindows.h(21): E2139 Declaration missing ;
Возникает на строке :
C++
1
XWindow     *FWindows[4];
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.09.2010, 14:42
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от davian Посмотреть сообщение
Есть два класса, 1 описан в header1.h, второй в header2.h. Во втором классе нужно использовать экземпляр первого и наоборот в первом эклемпляр второго...
По большому счёту такая реализация либо кривая, либо должна быть описана в одном файле. А вообще делается так:

C
1
2
3
4
5
6
7
8
9
10
11
12
/* Предописание структуры */
struct s1;
 
struct s2
{
  struct s1 *ptr;
};
 
struct s1
{
  struct s2 *ptr;
};
Причём заметь, что таким образом структуры могут перекрёстно ссылаться только по указателю (потому что указатель он всегда занимает фикисрованное количество байт независимо от размера структуры, куда он указывает). А по значению структуры не могут быть перекрёстными, потому что чтобы узнать размер структуры s1 нужно будет знать размер структуры s2, а чтобы узнать размер структуры s2 нужно будет знать размер структуры s1. Т.е. неразрешимая ситуация
3
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:51  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
По большому счёту такая реализация либо кривая, либо должна быть описана в одном файле. А вообще делается так:

C
1
2
3
4
5
6
7
8
9
10
11
12
/* Предописание структуры */
struct s1;
 
struct s2
{
  struct s1 *ptr;
};
 
struct s1
{
  struct s2 *ptr;
};
Причём заметь, что таким образом структуры могут перекрёстно ссылаться только по указателю (потому что указатель он всегда занимает фикисрованное количество байт независимо от размера структуры, куда он указывает). А по значению структуры не могут быть перекрёстными, потому что чтобы узнать размер структуры s1 нужно будет знать размер структуры s2, а чтобы узнать размер структуры s2 нужно будет знать размер структуры s1. Т.е. неразрешимая ситуация

Может я чего не понял... но я делаю точно также, только с классами... Просто header-ы не могу корректно настроить друг на друга...
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.09.2010, 16:41
Цитата Сообщение от davian Посмотреть сообщение
Просто header-ы не могу корректно настроить друг на друга...
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
2
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 08:20  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
Что значит предописания. Мне надо продублировать прототип? Тогда будут ошибки...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
17.09.2010, 09:55
davian, как-то так:
hdr_a.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef HDR_A_H
#define HDR_A_H 1
 
class B;
 
class A {
    B * b;
    /* something else */
};
        
#endif /* HDR_A_H */
hdr_b.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef HDR_B_H
#define HDR_B_H 1
 
class A;
 
class B {
    A * a;
    /* something else */
};
        
#endif /* HDR_B_H */
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.09.2010, 10:56
Цитата Сообщение от easybudda Посмотреть сообщение
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
0
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 13:45  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
Не прокатывает...
0
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
29.03.2013, 13:07
- Просто во втором листинге "XWindow.h" надо вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; и все скомпилится!
Там правда еще ошибки есть ...

Добавлено через 33 минуты
davian! Просто надо во 2-м header (XWindow.h) вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; И все скомпилится ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2013, 13:07
Помогаю со студенческими работами здесь

Warning: include(1) [function.include]: failed to open stream: No such file or directory in
Выдает вот такую ошибку Warning: include(1) : failed to open stream: No such file or directory in...

Warning: include(templates.php) [function.include]: failed to open stream: No such file or directory
Как исправить ошибку, этот текст выдает на главной странице

В чем суть директив #include <Windows.h> #include <stdlib.h>
/*хочу сделать простую графическую программу ранее работал с turbo 3.0 я так понимаю &lt;graphics.h&gt; это что-то вроде &lt;Windows.h&gt;...

Warning: include(Z:/home/localhost/www/layout/header.php) [function.include]: failed to open stream: No such f
Столкнулся с такой проблемой не инклудится файл include $g_site_root.'/layout/header.php';?&gt;,пишет нет такого файла или папки,но все есть и...

Не находит #include<iomanip.h> #include<conio.h>
Само задание: Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до A минут в месяц-C руб. а разговоры сверх...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru