С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
4 / 3 / 1
Регистрация: 18.09.2009
Сообщений: 10

Не комилится когда h-файлы инклюдят друг друга

18.11.2009, 21:34. Показов 1472. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два класса. Метод одного класса принимает указатель на другой класс.
A.h
C++
1
2
3
4
5
6
7
8
#pragma once
#include "B.h"
 
class A
{
public:
    void func(B *param);
};

B.h
C++
1
2
3
4
5
6
7
#pragma once
#include "A.h"
class B
{
public:
    void func(A *param);
};
У меня не компилится. Пишет error C2061: syntax error : identifier 'A'
Я думаю что проблема в том что они друг друга инклюдят. Если кто знает буду рад помощи.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2009, 21:34
Ответы с готовыми решениями:

Как в PHP отделить элементы друг от друга, чтобы не ругались друг на друга?
<?php $chitat = fopen('yoo.txt', 'r'); if (!$chitat) { echo 'Ошибка при открытии файла yoo.txt'; } while (false !== ($char =...

Как сделать так, чтобы разные файлы могли видеть друг друга?
Есть 2 формы. Одна вызывает другую. Есть класс, который подключается к 1-ой форме. Но когда я подключаю его ко 2-ой, она его не видит. ...

Как сделать, чтобы пользователи на сервере могли редактировать файлы друг друга?
Здравствуйте. В нашей организации имеется сеть из windows машин и файлового сервера на ubuntu 12.04. Доступ ко всем папкам настроен, всё...

7
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
18.11.2009, 21:49
A.h
C++
1
2
3
4
5
6
7
#pragma once
class B;
class A
{
public:
        void func(B *param);
};
B.h
C++
1
2
3
4
5
6
7
8
#pragma once
 
class A;
class B
{
public:
        void func(A *param);
};
1
60 / 60 / 9
Регистрация: 09.11.2009
Сообщений: 198
18.11.2009, 21:51
используйте стандартные средства, чтобы исключить рекурсивность команд #include.
У Вас:
A: #include "B"
B: #include "A" - "цикл" обращений.
Надо использовать директивы #define, #ifdef, #ifndef
1
4 / 3 / 1
Регистрация: 18.09.2009
Сообщений: 10
18.11.2009, 22:21  [ТС]
Цитата Сообщение от victor_g Посмотреть сообщение
используйте стандартные средства, чтобы исключить рекурсивность команд #include.
У Вас:
A: #include "B"
B: #include "A" - "цикл" обращений.
Надо использовать директивы #define, #ifdef, #ifndef
A.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef A_h
#define A_h
 
#include "B.h"
class A
{
public:
        void func(B *param);
};
#endif // A_h
B.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef B_h
#define B_h
 
#include "A.h"
class B
{
public:
        void func(A *param);
};
#endif // B_h
Сделал так как вы посоветовали. Эрроры остались. Может надо что-то еще?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
18.11.2009, 22:27
header_a.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef _header_a_h
#define _header_a_h
 
class b;
 
class a{
public:
    a();
    void foo(const b*);
 
    char res;
};
 
#endif
header_b.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _header_b_h
#define _header_b_h
 
class a;
 
class b{
public:
    b();
    void foo(const a*);
 
    char res;
};
#endif
source_ab.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "header_a.h"
#include "header_b.h"
 
#include <iostream>
 
void a::foo(const b* i){
    std::cout << i->res << std::endl;
}
 
void b::foo(const a* i){
    std::cout << i->res << std::endl;
}
 
a::a(): res('a'){ }
b::b(): res('b'){ }
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
#include "header_a.h"
#include "header_b.h"
 
int main()
{
    a i;
    b j;
 
    i.foo(&j);
    j.foo(&i);
 
    return 0;
}
Результат
b
a
Для продолжения нажмите любую клавишу . . .
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
18.11.2009, 22:31
Цитата Сообщение от victor_g Посмотреть сообщение
используйте стандартные средства, чтобы исключить рекурсивность команд #include.
У Вас:
A: #include "B"
B: #include "A" - "цикл" обращений.
Надо использовать директивы #define, #ifdef, #ifndef
#pragma once же
0
4 / 3 / 1
Регистрация: 18.09.2009
Сообщений: 10
18.11.2009, 23:04  [ТС]
ISergey, Большое спасибо. Сделал с опережающим объявлением классов и стало работать. Обязательно надо реализацию обоих классов в один cpp-файл сбросить. В общем спасибо.

Добавлено через 31 секунду
Всем спасибо. Разобрался.
0
60 / 60 / 9
Регистрация: 09.11.2009
Сообщений: 198
19.11.2009, 21:54
Цитата Сообщение от alex_x_x Посмотреть сообщение
#pragma once же
-упс, извините!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2009, 21:54
Помогаю со студенческими работами здесь

Наложение друг на друга
Добрый день форумчане у меня происходит вот такое с чем это может быть связано?

Тестируем друг-друга
Тестируем друг-друга. Столкнулся с тем что куча людей называют себя программистами - являясь дизайнерами, в лучшем случае. ...

Div-ы цепляются друг за друга
Здравствуйте. Подскажите пожалуйста почему когда допустим .positioner или .title задаешь margin-top, то смещается и .head, а margin-left...

Зависящие друг от друга Datagridviewcombobox
Есть 2 программно созданных столбца Datagridviewcomboboxcolumn Как сделать чтобы выбор во втором столбце зависел от выбора в первом ...

Наложение контролов друг на друга
Мне нужно, чтобы Lable накладывался на textbox. Как такое можно осуществить?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 04.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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru