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

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

17.07.2013, 20:50. Показов 1487. Ответов 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.07.2013, 20:51
Цитата Сообщение от hVoltage Посмотреть сообщение
а вот как исправить нет
Реализацию и объявление классов по отдельным файлам разнести
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:53  [ТС]
То есть определение функций-членов в другой файл?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.07.2013, 20:54
Цитата Сообщение от hVoltage Посмотреть сообщение
То есть определение функций-членов в другой файл?
именно. Разделите объявление и реализацию
1
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 20:59  [ТС]
Да, действительно работает. А для чего нужно вот так извращаться не скажете?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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,531
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
17.07.2013, 21:52
Фаил с реализацией не скомпилируется, если не будет объявления
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 28
17.07.2013, 21:59  [ТС]
А что ему может не понравится, если не будет объявления? (странно, но у меня действительно компилируется)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru