Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28

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

17.07.2013, 20:50. Показов 1587. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2013, 20:50
Ответы с готовыми решениями:

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

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

Есть два класса. Как из одного класса перенести данные в другой класс?
Есть два класса : планета и диспетчер планет. Диспетчер имеет информацию о планетах: их названия, координаты (в двумерном пространстве) и...

14
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 20:51
Цитата Сообщение от hVoltage Посмотреть сообщение
а вот как исправить нет
Реализацию и объявление классов по отдельным файлам разнести
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:53  [ТС]
То есть определение функций-членов в другой файл?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 20:54
Цитата Сообщение от hVoltage Посмотреть сообщение
То есть определение функций-членов в другой файл?
именно. Разделите объявление и реализацию
1
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:59  [ТС]
Да, действительно работает. А для чего нужно вот так извращаться не скажете?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 21:04
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:24  [ТС]
Так значит не нужно в каждый из файлов заголовка подключать другой файл заголовка?

Добавлено через 17 минут
Сформулирую понятнее. В файл A.h нужно подключать B.h?(и наоборот соответственно). И еще. В файл, в котором будет реализация функций нужно подключать эти заголовки?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
17.07.2013, 21:37
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:46  [ТС]
А если, допустим реализация функций класса A будет в файле A.cc. Реализация функций класса B будет в файле B.cc. Основной файл one.cpp. Файлы A.cc, B.cc, one.cpp комплилируются вместе. Нужно ли подключать в A.cc заголовок A.h, а в B.cc заголовок B.h?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 21:48
Цитата Сообщение от hVoltage Посмотреть сообщение
Нужно ли подключать в A.cc заголовок A.h, а в B.cc заголовок B.h?
Можно и не подключать, но тогда придется ручками писать объявление класса заново
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:51  [ТС]
Странно, все скомпилилось без подключений. Ошибка компилятора или я слишком многое хочу знать?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 21:52
Фаил с реализацией не скомпилируется, если не будет объявления
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:59  [ТС]
А что ему может не понравится, если не будет объявления? (странно, но у меня действительно компилируется)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.07.2013, 22:02
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от hVoltage Посмотреть сообщение
А что ему может не понравится, если не будет объявления?
Ну вы же когда кушать садитесь убеждаетесь, что перед Вами что-то съедобное, а не кирпичи с ржавыми гвоздями?
Скомпилируйте:
C++
1
2
void MyClass::Foo(){
}
3
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 22:05  [ТС]
Странно, если добавить в основной файл, то ошибка, а если в другой(A.cc), то все норм. Видимо компилируется не весь проект, а только основной файл. Во всяком случае спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2013, 22:05
Помогаю со студенческими работами здесь

Класс: Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap(other) и .what()...
Написать два класса — Normal и Double, в каждом из которых будет два метода — .swap(other) и .what() (и .__init__(start), задающий...

Объявить два интерфейса. Объявить два класса, первый из которых реализует один из интерфесов, а второй - оба
Помогите написать программу,несеку фишку.Объявить два интерфейса. Объявить два класса, первый из которых реализует один из интерфесов, а...

3 класса. Родительский класс - класс животных. Два класса наследника: Гиппопотамы и Зебры. Выбор структуры данных
Добрый День. Есть задача. Есть 3 класса. Родительский класс - это класс животных. Он абстрактный и содержит метод в котором считается...

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

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru