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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.86
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
#1

Трудности с include - C++

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

[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Эта ошибка вообще не понятна, ибо я просто не вижу у вас такого файла. Или это Xwindow теперешний?
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:32  [ТС]     Трудности с include #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];
Evg
Эксперт CАвтор FAQ
17381 / 5619 / 350
Регистрация: 30.03.2009
Сообщений: 15,395
Записей в блоге: 26
16.09.2010, 14:42     Трудности с include #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. Т.е. неразрешимая ситуация
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
16.09.2010, 14:51  [ТС]     Трудности с include #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-ы не могу корректно настроить друг на друга...
Evg
Эксперт CАвтор FAQ
17381 / 5619 / 350
Регистрация: 30.03.2009
Сообщений: 15,395
Записей в блоге: 26
16.09.2010, 16:41     Трудности с include #12
Цитата Сообщение от davian Посмотреть сообщение
Просто header-ы не могу корректно настроить друг на друга...
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 08:20  [ТС]     Трудности с include #13
Цитата Сообщение от Evg Посмотреть сообщение
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
Что значит предописания. Мне надо продублировать прототип? Тогда будут ошибки...
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
17.09.2010, 09:55     Трудности с include #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 */
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Evg
Эксперт CАвтор FAQ
17381 / 5619 / 350
Регистрация: 30.03.2009
Сообщений: 15,395
Записей в блоге: 26
17.09.2010, 10:56     Трудности с include #15
Цитата Сообщение от easybudda Посмотреть сообщение
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 13:45  [ТС]     Трудности с include #16
Цитата Сообщение от Evg Посмотреть сообщение
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
Не прокатывает...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 13:07     Трудности с include
Еще ссылки по теме:

C++ Возникли трудности(
C++ Работа с файлами в C# с исп. библиотек #include <stdio.h> #include <stdlib.h> #include <math.h> #include <io.h>
Чем отличается #include <cstring>, #include <string> и #include <string.h>? C++
Трудности с кодом C++
C++ #include<iostream>// подключение библиотек #include <conio.h> #include <climits>

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

Или воспользуйтесь поиском по форуму:
Okonenko Stanis
6 / 6 / 1
Регистрация: 06.02.2013
Сообщений: 71
29.03.2013, 13:07     Трудности с include #17
- Просто во втором листинге "XWindow.h" надо вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; и все скомпилится!
Там правда еще ошибки есть ...

Добавлено через 33 минуты
davian! Просто надо во 2-м header (XWindow.h) вместо инструкции: #include "SWindows.h"
поставить предварительное объявление: class SWindows; И все скомпилится ...
Yandex
Объявления
29.03.2013, 13:07     Трудности с include
Ответ Создать тему
Опции темы

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