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

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

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

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

16.09.2010, 13:28. Просмотров 5159. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2010, 13:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Трудности с include (C++):

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

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

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

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

Какая разница между #include<> и #include""? - C++
Позволите спросить несколько вопросов: 1)Какая разница между #include&lt;&gt; и #include&quot;&quot; 2)Если нужно значение объекта и я не собираюсь его...

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

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

[BCC32 Fatal Error] XrayWindow.h(9): F1005 Include files nested too deep
Эта ошибка вообще не понятна, ибо я просто не вижу у вас такого файла. Или это Xwindow теперешний?
0
davian
4 / 4 / 0
Регистрация: 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
17934 / 6160 / 408
Регистрация: 30.03.2009
Сообщений: 16,909
Записей в блоге: 27
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
davian
4 / 4 / 0
Регистрация: 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
17934 / 6160 / 408
Регистрация: 30.03.2009
Сообщений: 16,909
Записей в блоге: 27
16.09.2010, 16:41 #12
Цитата Сообщение от davian Посмотреть сообщение
Просто header-ы не могу корректно настроить друг на друга...
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
2
davian
4 / 4 / 0
Регистрация: 07.07.2009
Сообщений: 122
17.09.2010, 08:20  [ТС] #13
Цитата Сообщение от Evg Посмотреть сообщение
И не настроишь. Надо просто добавить предописания структуры в каждый хедер, а инклюд удалить
Что значит предописания. Мне надо продублировать прототип? Тогда будут ошибки...
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,775
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
17934 / 6160 / 408
Регистрация: 30.03.2009
Сообщений: 16,909
Записей в блоге: 27
17.09.2010, 10:56 #15
Цитата Сообщение от easybudda Посмотреть сообщение
Только по-моему таких вещей лучше избегать. Попробуйте как-то по-другому спроектировать...
Именно так. Или, если уж по другому не получается, хотя бы всё это дело помещать в один *.h файд, а не в два разных
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2010, 10:56
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
17.09.2010, 10:56
Ответ Создать тему
Опции темы

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