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

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

18.11.2009, 21:34. Показов 935. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2009, 21:34
Ответы с готовыми решениями:

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

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

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

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

7
Maniac
Эксперт С++
1456 / 957 / 159
Регистрация: 02.01.2009
Сообщений: 2,816
Записей в блоге: 1
18.11.2009, 21:49 2
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 3
используйте стандартные средства, чтобы исключить рекурсивность команд #include.
У Вас:
A: #include "B"
B: #include "A" - "цикл" обращений.
Надо использовать директивы #define, #ifdef, #ifndef
1
4 / 3 / 1
Регистрация: 18.09.2009
Сообщений: 10
18.11.2009, 22:21  [ТС] 4
Цитата Сообщение от 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
Эксперт С++
1456 / 957 / 159
Регистрация: 02.01.2009
Сообщений: 2,816
Записей в блоге: 1
18.11.2009, 22:27 5
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
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
18.11.2009, 22:31 6
Цитата Сообщение от 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  [ТС] 7
ISergey, Большое спасибо. Сделал с опережающим объявлением классов и стало работать. Обязательно надо реализацию обоих классов в один cpp-файл сбросить. В общем спасибо.

Добавлено через 31 секунду
Всем спасибо. Разобрался.
0
60 / 60 / 9
Регистрация: 09.11.2009
Сообщений: 198
19.11.2009, 21:54 8
Цитата Сообщение от alex_x_x Посмотреть сообщение
#pragma once же
-упс, извините!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2009, 21:54

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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