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

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

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

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

16.09.2010, 13:28. Просмотров 5025. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2010, 13:28     Трудности с include
Посмотрите здесь:

Трудности с кодом - C++
Выдает такие ошибки: Error (active) "exit" is ambiguous Error C2365 'exit': redefinition; previous definition was 'function' ...

Трудности с SendMessage - C++
Есть такой вот код: //Autor Anonim #include <conio.h> #include <iostream> #include <ostream> #include <Windows.h> #include...

Возникли трудности( - C++

Трудности с ответом - C++
1) Дана следуюшая declarations: int myFunction(int myValue); int myArray; Что из ниже следуюшего имеет легальный call to this...

трудности с CharToOem - C++
есть код: char* Rus(char* text) { char* buf = new char(600); CharToOem(text, buf); strcpy(text, buf); delete...

Трудности на начальной стадии - C++
Написал первый программный код "Привет Мир" #include <iostream.h> int main () { cout <<"Hello World!\n" return 0; }Все...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,937
Записей в блоге: 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
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,937
Записей в блоге: 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
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,507
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 */
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2010, 10:56     Трудности с include
Еще ссылки по теме:

Трудности в реализации класса - C++
Не могу понять, почему не работают конструкторы класса... Прошу понятного объяснения=) вот код 1 файл #ifndef ___MAS #define ___MAS...

Трудности с переводом с Паскаля на С++ - C++
Переведите программу из языка Pascal в язык C++. Вот программа: Program 253; var s:string; i,n :byte; begin readln(s); for...

Трудности с работой прогаммы - C++
//--------------------------------------------------------------------------- #include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;conio.h&gt; ...

Трудности перегрузки из-за наследования - C++
Если у меня есть класс MyClass и в этом классе я хочу реализовать два перегруженных оператора вывода в потоки в виде дружественных функций....

Ряд тейлора, трудности - C++
Прошу помочь с разложением cos(x) через ряд Тейлора double x,E; const long N=12; double mpow(double x, long y) {


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,937
Записей в блоге: 26
17.09.2010, 10:56     Трудности с include #15
Цитата Сообщение от easybudda Посмотреть сообщение
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
Yandex
Объявления
17.09.2010, 10:56     Трудности с include
Ответ Создать тему
Опции темы

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