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

Взаимоотношения между двумя классами в простой программе

10.01.2019, 17:54. Показов 2204. Ответов 9

Студворк — интернет-сервис помощи студентам
Все просто - минимальная программа с двумя классами, в каждом из которых есть метод, который принимает экземпляр другого класса:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "pch.h"
#include <iostream>
#include "A.h"
#include "B.h"
using namespace std;
 
int main()
{
    A a;
 
    B b;
 
    b.foo(a);
 
    a.foo(b);
 
    system("pause");
}
A.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
 
#include <iostream>
using namespace std;
 
class A
{
public:
    A();
 
    void foo(B &b);
};
A.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "pch.h"
#include "A.h"
 
 
A::A()
{}
 
void A::foo(B &b)
{
    cout << "foo" << endl;
}
B.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
 
#include <iostream>
using namespace std;
#include "A.h" // типо чтобы класс В знал о классе А
 
class B
{
public:
    B();
 
    void foo(A &a);
};
B.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "pch.h"
#include "B.h"
 
 
B::B()
{}
 
void B::foo(A &a)
{
    cout << "foo" << endl;
}
Это все выдает уйму ошибок, пожалуйста, разжуйте мне максимально подробно 1 - Что происходит и почему это не компилируется 2 - как правильно поступить в подобной ситуации. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2019, 17:54
Ответы с готовыми решениями:

Определение связи между двумя классами
При оформлении отчета к лабораторной работе возник вопрос. Необходимо изобразить схему классов, иллюстрирующую отношения между ними...

Как передать значение между двумя классами?
Добрый вечер. Есть 2 класса. @interface ViewController : UIViewController { NSString* btAddr; } /*....*/

Как создать connect между двумя классами
Здравствуйте форумчане. Есть вопрос как отправить сигнал из одного из классов. Есть вот такой код. Ругается на строчку emit...

9
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.01.2019, 18:34
Лучший ответ Сообщение было отмечено KRC как решение

Решение

KRC, попробуй в начало A.H написать class B;
попробуй в начало B.H написать class A;
Цитата Сообщение от KRC Посмотреть сообщение
#include "A.h" // типо чтобы класс В знал о классе А
этого не нужно
Если это не поможет, передавай не через '&' а честно через указатель

Добавлено через 3 минуты
Суть в том, что если класс B где-то использует *A, то ему совершенно не надо знать внутреннего строения класса A. Ему надо только знать, что такой класс есть. Ибо все указатели занимают одинаковое количество памяти.
1
-80 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 811
10.01.2019, 18:50
Доброго всем здравия, духовного и телесного.
Люди с добрыми сердцами, подскажите пожалуйста как эти процессы официально называются?
Создание библиотек? Или я как обычно туплю?
0
0 / 0 / 0
Регистрация: 06.08.2018
Сообщений: 22
10.01.2019, 19:06  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
если класс B где-то использует *A, то ему совершенно не надо знать внутреннего строения класса A.
кажется я наконец поняла зачем нужен указатель(позор)
Цитата Сообщение от Байт Посмотреть сообщение
попробуй в начало A.H написать class B;
попробуй в начало B.H написать class A;
поняла, попробую. Вообще эта проблема возникла в моем большом проэкте, пример - это я просто минимизировала проблему(на всякий случой)

Добавлено через 13 минут
Цитата Сообщение от gogaloh Посмотреть сообщение
как эти процессы официально называются?
какие процессы? вы о чем?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.01.2019, 19:08
Цитата Сообщение от KRC Посмотреть сообщение
пример - это я просто минимизировала проблему(на всякий случай)
И очень даже грамотно поступила!
0
0 / 0 / 0
Регистрация: 06.08.2018
Сообщений: 22
10.01.2019, 20:08  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
попробуй в начало A.H написать class B;
попробуй в начало B.H написать class A;
Я сделала как ты сказал(я так поняла это типо прототипы классов) и все работает, сейчас попробую в проекте, спасибо тебе)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.01.2019, 20:57
Цитата Сообщение от Байт Посмотреть сообщение
если класс B где-то использует *A
Это я чушенцию написал. Вместо "*A" следует читать "A *a". Но, надеюсь, был понят правильно

Добавлено через 9 минут
Цитата Сообщение от KRC Посмотреть сообщение
я так поняла это типо прототипы классов
Не совсем. Прототипы - это другое. Это просто рассказ компилятору, что такая штука есть. Называется, кажется, "предварительное объявление".
В принципе можно было бы создать компилятор, который бы кушал бы штуки типа
C++
1
2
class B {
  CHERT_KNOW_WHAT *X;
Но существующие компиляторы чрезвычайно любопытны. Им все надо знать заранее.
0
0 / 0 / 0
Регистрация: 06.08.2018
Сообщений: 22
10.01.2019, 21:51  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
передавай не через '&' а честно через указатель
Добавлено через 3 минуты
Суть в том, что если класс B где-то использует *A, то ему совершенно не надо знать внутреннего строения класса A. Ему надо только знать, что такой класс есть. Ибо все указатели занимают одинаковое количество памяти.
Смотри что сделала - не работает Ошибка: слева от m_a/m_b должен быть класс, структура или обьединение.
(Я просто попробовала в проекте большом, и поняла что там немного сложнее ситуация - поэтому "минимальный экземпляр проблемы" немного изменился и я пытаюсь пользоваться указателем)

main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "pch.h"
#include <iostream>
#include "A.h"
#include "B.h"
using namespace std;
 
int main()
{
    A a;
 
    B b;
 
 
    b.foo(&a);
 
    a.foo(&b);
 
    system("pause");
}
A.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
 
#include <iostream>
using namespace std;
class B;
 
 
class A
{
public:
    int m_a = 34634;
 
    A();
 
    void foo(B *bPtr);
};
A.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "pch.h"
#include "A.h"
 
 
A::A()
{
 
}
 
 
void A::foo(B *bPtr)
{
    cout << *bPtr.m_b << endl;
}
B.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
 
#include <iostream>
using namespace std;
class A;
 
class B
{
public:
    int m_b = 35634;
 
    B();
 
    void foo(A *aPtr);
};
B.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "pch.h"
#include "B.h"
 
 
B::B()
{
}
 
 
void B::foo(A *aPtr)
{
    cout << *aPtr.m_a << endl;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.01.2019, 22:02
Лучший ответ Сообщение было отмечено KRC как решение

Решение

KRC, А вот реализация методов (a.cpp, b.cpp) должна видеть полное описание классов
Вставь в оба cpp оба инклюда (a.h, b.h)
1
0 / 0 / 0
Регистрация: 06.08.2018
Сообщений: 22
11.01.2019, 18:03  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
реализация методов (a.cpp, b.cpp) должна видеть полное описание классов
Вставь в оба cpp оба инклюда (a.h, b.h)
Попробовала только что - все работает! Здорово! Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2019, 18:03
Помогаю со студенческими работами здесь

Распределить между двумя созданными дисплейными классами компьютеры
Нужно написать задачу в паскале по такому условию: Распределить между двумя созданными дисплейными классами компьютеры таким образом,...

Взаимоотношения между детьми
Работал на билдере, перешёл на qt. Имеется простая проблема - организовать обмен данными между детьми одного родителя. .h #ifndef...

простой медленный обмен между двумя МК - что выбрать?
хочется иногда немного распаралелить и работу и разработку своих любительских устройств и иметь например датчик на какой-нибуть тиньке -...

Простой пример пересылки сообщения между двумя консолями через сокеты. VS15
Может у кого-то есть примеры таких проектов? Какой день сижу в гугле, все примеры не хотят компилироваться в VS15! Если это чем-то не...

Найти кратчайшее расстояние между двумя вершинами в графе. Найти все возможные пути между этими двумя вершинам
Найти кратчайшее расстояние между двумя вершинами в графе. Найти все возможные пути между этими двумя вершинами в графе, не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru