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

Трудности с include

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

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

Есть два класса, 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2010, 13:28
Ответы с готовыми решениями:

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

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

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

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...

16
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 13:56 2
davian, Стражи в хедерах поставлены?
Либо #pragma once в каждом,
либо
обычный страж в каждом хедере
1
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:00  [ТС] 3
Цитата Сообщение от Lavroff Посмотреть сообщение
davian, Стражи в хедерах поставлены?
Либо #pragma once в каждом,
либо
обычный страж в каждом хедере
Тут поподробнее... Что это такое и с чем ЕГО едят....
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:02 4
davian, Страж включения позволяет включать один и тот же хедер несколько раз в проекте. Обычный страж выглядит так, для файла header.
C++
1
2
3
4
#ifndef _HEADER_H_
#define _HEADER_H_
//Код
#endif
Собственно приспособьте под свои и попробуйте.
1
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:20  [ТС] 5
Теперь ошибки другие полезли:
[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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:25 6
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
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:29  [ТС] 7
та же самая ошибка...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2010, 14:30 8
Видимо не в этом было дело... Текст ошибки в студию.

[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Эта ошибка вообще не понятна, ибо я просто не вижу у вас такого файла. Или это Xwindow теперешний?
0
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:32  [ТС] 9
Цитата Сообщение от 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.09.2010, 14:42 10
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:51  [ТС] 11
Цитата Сообщение от 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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
16.09.2010, 16:41 12
Цитата Сообщение от davian Посмотреть сообщение
Просто header-ы не могу корректно настроить друг на друга...
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
2
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 08:20  [ТС] 13
Цитата Сообщение от Evg Посмотреть сообщение
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
Что значит предописания. Мне надо продублировать прототип? Тогда будут ошибки...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.09.2010, 09:55 14
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
17.09.2010, 10:56 15
Цитата Сообщение от easybudda Посмотреть сообщение
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
0
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 13:45  [ТС] 16
Цитата Сообщение от Evg Посмотреть сообщение
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
Не прокатывает...
0
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
29.03.2013, 13:07 17
- Просто во втором листинге "XWindow.h" надо вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; и все скомпилится!
Там правда еще ошибки есть ...

Добавлено через 33 минуты
davian! Просто надо во 2-м header (XWindow.h) вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; И все скомпилится ...
0
29.03.2013, 13:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2013, 13:07
Помогаю со студенческими работами здесь

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;...

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 минут в...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru