Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
1

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

17.07.2013, 20:50. Просмотров 1047. Ответов 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) ===|

В чем суть ошибки я понял, а вот как исправить нет
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2013, 20:50
Ответы с готовыми решениями:

Есть два класса необходимо передать из одного класса информацию в другую
Есть два класса, class entiti { public: test* emap; }; class test { public:

Два класса, два деструктора. После срабатывания второго первому нечего удалять
Доброго времени суток. Помогите, пожалуйста, понять где ошибка. Компилируется, вылетает на...

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

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

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

14
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
17.07.2013, 20:51 2
Цитата Сообщение от hVoltage Посмотреть сообщение
а вот как исправить нет
Реализацию и объявление классов по отдельным файлам разнести
0
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:53  [ТС] 3
То есть определение функций-членов в другой файл?
0
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
17.07.2013, 20:54 4
Цитата Сообщение от hVoltage Посмотреть сообщение
То есть определение функций-членов в другой файл?
именно. Разделите объявление и реализацию
1
17.07.2013, 20:54
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:59  [ТС] 5
Да, действительно работает. А для чего нужно вот так извращаться не скажете?
0
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
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 ничего неизвестно
}
};
0
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:24  [ТС] 7
Так значит не нужно в каждый из файлов заголовка подключать другой файл заголовка?

Добавлено через 17 минут
Сформулирую понятнее. В файл A.h нужно подключать B.h?(и наоборот соответственно). И еще. В файл, в котором будет реализация функций нужно подключать эти заголовки?
0
Kuzia domovenok
2912 / 2479 / 641
Регистрация: 25.03.2012
Сообщений: 8,840
Записей в блоге: 1
Завершенные тесты: 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"
1
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?
0
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
17.07.2013, 21:48 10
Цитата Сообщение от hVoltage Посмотреть сообщение
Нужно ли подключать в A.cc заголовок A.h, а в B.cc заголовок B.h?
Можно и не подключать, но тогда придется ручками писать объявление класса заново
0
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:51  [ТС] 11
Странно, все скомпилилось без подключений. Ошибка компилятора или я слишком многое хочу знать?
0
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
17.07.2013, 21:52 12
Фаил с реализацией не скомпилируется, если не будет объявления
0
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:59  [ТС] 13
А что ему может не понравится, если не будет объявления? (странно, но у меня действительно компилируется)
0
Croessmah
++Ͻ
15953 / 9063 / 1746
Регистрация: 27.09.2012
Сообщений: 22,303
Записей в блоге: 2
Завершенные тесты: 2
17.07.2013, 22:02 14
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от hVoltage Посмотреть сообщение
А что ему может не понравится, если не будет объявления?
Ну вы же когда кушать садитесь убеждаетесь, что перед Вами что-то съедобное, а не кирпичи с ржавыми гвоздями?
Скомпилируйте:
C++
1
2
void MyClass::Foo(){
}
3
hVoltage
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 22:05  [ТС] 15
Странно, если добавить в основной файл, то ошибка, а если в другой(A.cc), то все норм. Видимо компилируется не весь проект, а только основной файл. Во всяком случае спасибо
0
17.07.2013, 22:05
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 22:05

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

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

Программа содержит два класса.
Помогите решить, пожалуйста. Спасибо. Программа содержит два класса. Оба класса содержат по...


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

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

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