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

Два взаимосвязных класса - C++

Восстановить пароль Регистрация
 
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:50     Два взаимосвязных класса #1
Имеется два файла заголовка.
A.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef A_INCLUDED
#define A_INCLUDED
#include "B.h"
class B;
 
class A{
public:
    B* nt;
    void Afun() {}
    void Oo() {nt->Bfun();}
};
 
 
#endif // A_INCLUDED
B.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef B_INCLUDED
#define B_INCLUDED'
#include "A.h"
class A;
 
class B{
public:
    A* th;
    void oO() {th->Afun();}
    void Bfun() {};
};
 
 
#endif // B_INCLUDED
И имеется файл исходного кода
one.cpp
C++
1
2
#include "B.h"
#include "A.h"
При компиляции этого файла появляются ошибки.
/home/voltage/Projects/Unt/A.h||In member function ‘void A::Oo()’:|
/home/voltage/Projects/Unt/A.h|10|error: invalid use of incomplete type ‘class B’|
/home/voltage/Projects/Unt/A.h|4|error: forward declaration of ‘class B’|
||=== Build finished: 2 errors, 3 warnings (0 minutes, 0 seconds) ===|

В чем суть ошибки я понял, а вот как исправить нет
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 20:51     Два взаимосвязных класса #2
Цитата Сообщение от hVoltage Посмотреть сообщение
а вот как исправить нет
Реализацию и объявление классов по отдельным файлам разнести
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:53  [ТС]     Два взаимосвязных класса #3
То есть определение функций-членов в другой файл?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 20:54     Два взаимосвязных класса #4
Цитата Сообщение от hVoltage Посмотреть сообщение
То есть определение функций-членов в другой файл?
именно. Разделите объявление и реализацию
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:59  [ТС]     Два взаимосвязных класса #5
Да, действительно работает. А для чего нужно вот так извращаться не скажете?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 21:04     Два взаимосвязных класса #6
Цитата Сообщение от hVoltage Посмотреть сообщение
А для чего нужно вот так извращаться не скажете?
Где извращение?

а вообще:
C++
1
2
3
4
5
6
7
8
9
class B;//опережающее объявление дает нам имя класса для компиляции
 
class A{
public:
    B* nt;
    void Afun() {}
    void Oo() {nt->Bfun();//О реализации класса B ничего неизвестно
}
};
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:24  [ТС]     Два взаимосвязных класса #7
Так значит не нужно в каждый из файлов заголовка подключать другой файл заголовка?

Добавлено через 17 минут
Сформулирую понятнее. В файл A.h нужно подключать B.h?(и наоборот соответственно). И еще. В файл, в котором будет реализация функций нужно подключать эти заголовки?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
17.07.2013, 21:37     Два взаимосвязных класса #8
Цитата Сообщение от hVoltage Посмотреть сообщение
Так значит не нужно в каждый из файлов заголовка подключать другой файл заголовка?
не нужно
Цитата Сообщение от hVoltage Посмотреть сообщение
Сформулирую понятнее. В файл A.h нужно подключать B.h?(и наоборот соответственно). И еще. В файл, в котором будет реализация функций нужно подключать эти заголовки?
A.h
C++
1
2
3
4
5
6
7
8
9
#ifndef A_INCLUDED
#define A_INCLUDED 
class A{
public:
    B* nt;
    void Afun() {}
    void Oo() {nt->Bfun();}
};
#endif // A_INCLUDED
B.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef B_INCLUDED
#define B_INCLUDED
class A; 
class B{
public:
    A* th;
    void oO() {th->Afun();}
    void Bfun() {};
}; 
#endif // B_INCLUDED
one.cpp
C++
1
2
#include "B.h"
#include "A.h"
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:46  [ТС]     Два взаимосвязных класса #9
А если, допустим реализация функций класса A будет в файле A.cc. Реализация функций класса B будет в файле B.cc. Основной файл one.cpp. Файлы A.cc, B.cc, one.cpp комплилируются вместе. Нужно ли подключать в A.cc заголовок A.h, а в B.cc заголовок B.h?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 21:48     Два взаимосвязных класса #10
Цитата Сообщение от hVoltage Посмотреть сообщение
Нужно ли подключать в A.cc заголовок A.h, а в B.cc заголовок B.h?
Можно и не подключать, но тогда придется ручками писать объявление класса заново
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:51  [ТС]     Два взаимосвязных класса #11
Странно, все скомпилилось без подключений. Ошибка компилятора или я слишком многое хочу знать?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 21:52     Два взаимосвязных класса #12
Фаил с реализацией не скомпилируется, если не будет объявления
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:59  [ТС]     Два взаимосвязных класса #13
А что ему может не понравится, если не будет объявления? (странно, но у меня действительно компилируется)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.07.2013, 22:02     Два взаимосвязных класса #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от hVoltage Посмотреть сообщение
А что ему может не понравится, если не будет объявления?
Ну вы же когда кушать садитесь убеждаетесь, что перед Вами что-то съедобное, а не кирпичи с ржавыми гвоздями?
Скомпилируйте:
C++
1
2
void MyClass::Foo(){
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 22:05     Два взаимосвязных класса
Еще ссылки по теме:

Два класса, ошибка из-за приватности полей C++
C++ Общий метод на два класса
C++ Объединить два похожих класса

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

Или воспользуйтесь поиском по форуму:
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 22:05  [ТС]     Два взаимосвязных класса #15
Странно, если добавить в основной файл, то ошибка, а если в другой(A.cc), то все норм. Видимо компилируется не весь проект, а только основной файл. Во всяком случае спасибо
Yandex
Объявления
17.07.2013, 22:05     Два взаимосвязных класса
Ответ Создать тему
Опции темы

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