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

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

Войти
Регистрация
Восстановить пароль
 
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
#1

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

17.07.2013, 20:50. Просмотров 474. Ответов 14
Метки нет (Все метки)

Имеется два файла заголовка.
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2013, 20:50     Два взаимосвязных класса
Посмотрите здесь:

Программа содержит два класса. Оба класса содержат по одному целому полю и по одному указателю на символьный тип. - C++
Помогите решить с объяснениями. Программа содержит два класса. Оба класса содержат по одному целому полю и по одному указателю на...

Два класса, с преобразованием строки - C++
Определить два класса, строку с преобразование из char * в строку и обратно и Double с преобразованием из double и обратно, а также...

Программа содержит два класса. - C++
Помогите решить, пожалуйста. Спасибо. Программа содержит два класса. Оба класса содержат по одному целому полю и по одному указателю...

Общий метод на два класса - C++
У меня есть 2 класса, в которых применяется одна и таже функция. Наследовать их друг у друга я не хочу из за этой одной функции....

Объединить два похожих класса - C++
Доброго времени суток. Есть два класса, полностью одинаковых в логике, различие только в том что один содержит один enum, второй другой....

Два класса с одинаковыми именами - C++
В глобальной области видимости есть функция Polygon. Можно ли в своем пространстве имен создать класс с именем Polygon? Будут они мешать...

Даны два класса: ellipse и circle - C++
Помогите решить пожалуйста!Да,я чайник.. :( Даны два класса: ellipse и circle. Объекты этих классов могут быть отображены на экране с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 20:51     Два взаимосвязных класса #2
Цитата Сообщение от hVoltage Посмотреть сообщение
а вот как исправить нет
Реализацию и объявление классов по отдельным файлам разнести
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:53  [ТС]     Два взаимосвязных класса #3
То есть определение функций-членов в другой файл?
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 20:54     Два взаимосвязных класса #4
Цитата Сообщение от hVoltage Посмотреть сообщение
То есть определение функций-членов в другой файл?
именно. Разделите объявление и реализацию
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:59  [ТС]     Два взаимосвязных класса #5
Да, действительно работает. А для чего нужно вот так извращаться не скажете?
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 21:52     Два взаимосвязных класса #12
Фаил с реализацией не скомпилируется, если не будет объявления
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:59  [ТС]     Два взаимосвязных класса #13
А что ему может не понравится, если не будет объявления? (странно, но у меня действительно компилируется)
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 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++
Класс B является наследником класса A. Для класса B нужно определить 2 конструктора: один - наследуется от конструктора класса А, второй...

Два класса, вызывающие друг друга - C++
У меня есть файл class1.h и файл class2.h внутри класса 1 вызывается класс 2 и наоборот. Но, класс 1 располагается выше и не видит...

Создать два подкласса одного класса - C++
Нужно создать базовый класс Animal и два его подкласса (Tiger и Fox). Поля каждого класса могут быть созданы произвольно. Я...

Создать два класса: фермер и реестр - C++
Здравствуйте !!! помогите с задачей... реестр фермеров ( создать два класса: фермер и реестр ) - конструкторы :...


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

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

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