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

Взаимное ограничение видимости классов. - C++

Восстановить пароль Регистрация
 
rotten
0 / 0 / 0
Регистрация: 30.05.2011
Сообщений: 3
30.05.2011, 17:51     Взаимное ограничение видимости классов. #1
Всем доброго дня.
Есть банальная ситуация(по крайней мере для меня т.к. недавно только начал учить с++):

Есть 2 класса. 1й - в файле A.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
 
// include guard
#ifndef BB
#define BB 
#include "B.H"
#endif
 
 
class A{
 
public:
    A();
    
    A(B b);
};
Ну и второй - в файле B.h:
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
 
#include "A.H"
    
class B{
 
public:
    B();
    B(A a);
};
Что мы имеем и что по шагам должен делать компилятор?
1. Класс А использует класс В, соответственно вначале ему нужно его подключить.
2. Подключив его и ввиду того что классу В тоже нужен класс А, то класс В тоже подключает класс А; при помощи макросов установлено безопасное подключение и файл подключаеться лишь раз. Тут все хорошо.
3. Вот оно - несоответствие: Компилятор, продолжая анализировать класс А, который класс В хочет подключить, находит в нем первое упоминание класса В во втором перегруженном конструкторе:
C++
1
A(B b);
Но класс В еще не обявлен, и компилятор соответственно о нем не знает.

Я запутался. Сначала думал что проблема както напряму может быть связана с множественным подключением, но тут наоборот както выходит - не хватает инфы о Классах.
Это и не странно с одной стороны.
Я - продолжительное время на джаве работал, там такого нет. Потому и странно для меня.

Подскажите пожалуйста какими способами можно закрыть этот дефект и дать обеим классам знать о себе сразу... перед обьявлениями?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.05.2011, 18:43     Взаимное ограничение видимости классов. #2
C++
1
2
3
4
5
6
7
8
class B;//просто говорит о том, что где-то есть класс Б
class A{
 
public:
        A();
        
        A(B b);
};
C++
1
2
3
4
5
6
7
class A;//аналогично     
class B{
 
public:
        B();
        B(A a);
};
rotten
0 / 0 / 0
Регистрация: 30.05.2011
Сообщений: 3
30.05.2011, 18:55  [ТС]     Взаимное ограничение видимости классов. #3
Kastaneda, если бы... Я уже так пробовал.
Компилятор всеравно отказывает:
C++
1
error C2027: use of undefined type 'B'
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.05.2011, 19:03     Взаимное ограничение видимости классов. #4
Не обратил внимания, у вас со стражами проблемы. Вот так скомпилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//файл A.h
#ifndef A_H
#define A_H 
#include "B.H"
 
class B;
class A{
 
public:
        A();
        
        A(B b);
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//файл B.h
#ifndef B_H
#define B_H
#include "A.H"
 
class A;      
class B{
 
public:
        B();
        B(A a);
};
#endif
rotten
0 / 0 / 0
Регистрация: 30.05.2011
Сообщений: 3
30.05.2011, 19:36  [ТС]     Взаимное ограничение видимости классов. #5
Kastaneda, спасибо. Пока все проходит тихо.
Замечу однако, так же, что важно чтобы конструкторы/методы были только обьявленными, но никак не инициированы (фигурными скобками)...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
30.05.2011, 19:38     Взаимное ограничение видимости классов. #6
Цитата Сообщение от rotten Посмотреть сообщение
важно чтобы конструкторы/методы были только обьявленными, но никак не инициированы (фигурными скобками)
Так реализацию обычно в .cpp файлах пишут, в которые включены хедеры.
Yandex
Объявления
30.05.2011, 19:38     Взаимное ограничение видимости классов.
Ответ Создать тему
Опции темы

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