Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2016, 19:24   #1
alm43
 
Регистрация: 23.01.2016
Сообщений: 4
По умолчанию Объявление связанных классов

Имеется объявление двух классов. Заголовочный файл выглядит следующим образом:
Код:
class Foo;

class Bar
{
public:
        void UseFoo(Foo * AFoo);
private:
        Foo * FFoo;
};

class Foo
{
public:
        void UseBar(Bar * ABar);
private:
        Bar * FBar;
};
Реализация каждого метода присваивает параметр полю класса.
Как корректно разнести объявления этих классов по разным файлам?
E-mail: alm43.alm43@gmail.com
alm43 вне форума Ответить с цитированием
Старый 18.04.2016, 20:43   #2
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Как-то так:

bar.h:
Код:
//Не забыть впихнуть include guards
class Foo;
class Bar
{
public:
        void UseFoo(Foo * AFoo);
private:
        Foo * FFoo;
};
foo.h:
Код:
//Не забыть впихнуть include guards
class Bar;
class Foo
{
public:
        void UseBar(Bar * ABar);
private:
        Bar * FBar;
};
bar.cpp:
Код:
#include "bar.h"
#include "foo.h"

//реализация Bar
foo.cpp:
Код:
#include "bar.h"
#include "foo.h"

//реализация Foo
Croessmah вне форума Ответить с цитированием
Старый 18.04.2016, 21:00   #3
alm43
 
Регистрация: 23.01.2016
Сообщений: 4
По умолчанию

Спасибо, компилируется.
E-mail: alm43.alm43@gmail.com
alm43 вне форума Ответить с цитированием
Старый 18.04.2016, 21:05   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от alm43 Посмотреть сообщение
Спасибо, компилируется.
Пожалуйста
Croessmah вне форума Ответить с цитированием
Старый 19.04.2016, 15:59   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Моё мнение, подобная конструкция уже ошибка. Например, если будут использоваться мьютексы, легко получить deadlock (да, на есть специальные мьютексы для таких ситуаций, но они более "дорогие"). В программе должна быть чёткая и ясная иерархия, я даже нумерую исходники (файл с меньшим номером не может заинклудить файл с большим или равным номером). Поэтому правильней реализовать следующую схему:
Код:
// 1_Bar_base.h
class Bar_base
{
// Необходимый базовый функционал для Foo
};

// 2_Foo.h
class Foo
{
public:
        void UseBar(Bar_base * ABar);
private:
        Bar_base * FBar;
};

// 3_Bar.h
class Bar : public Bar_base
{
public:
        void UseFoo(Foo * AFoo);
private:
        Foo * FFoo;
};
100% гарантий не будет (при использовании виртуальных функций, например), но при некотором наборе правил можно избежать проблемы.

Последний раз редактировалось 220Volt; 19.04.2016 в 16:44.
220Volt вне форума Ответить с цитированием
Старый 19.04.2016, 16:13   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причем тут мютексы вообще?

ваш вариант усложнил структуру классов.
и усложняет поддержку кода.
добавили функцию в Bar, потом, ой, а она нужна для Foo, и переносим в Bar_Base.
+ излишняя раздробенность кода вышла.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 16:40   #7
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
причем тут мютексы вообще?
При том, что такую ошибку будет не видно, программа тупо повиснет (я пытался набросать у себя, но std::mutex ведёт себя как std::recursive_mutex). При обычной рекурсии получим хотябы падение программы.

Цитата:
ваш вариант усложнил структуру классов.
и усложняет поддержку кода.
добавили функцию в Bar, потом, ой, а она нужна для Foo, и переносим в Bar_Base.
+ излишняя раздробенность кода вышла.
Ну я не настаиваю, на каких-то авторитетов сослаться не могу. Хотя не исключаю, что кто-то рекомендует делать именно так. И никаких доп функций не добавлял.
ЗЫ: въехал про доп функцию ))

Последний раз редактировалось 220Volt; 19.04.2016 в 16:51.
220Volt вне форума Ответить с цитированием
Старый 19.04.2016, 17:08   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
При том, что такую ошибку будет не видно, программа тупо повиснет
Какую? В данном случае имеем только ошибку компиляции.
Что там у ТС и как далее - неизвестно.
Цитата:
При обычной рекурсии получим хотябы падение программы.
Где здесь рекурсия?
Croessmah вне форума Ответить с цитированием
Старый 19.04.2016, 17:28   #9
alm43
 
Регистрация: 23.01.2016
Сообщений: 4
По умолчанию

220Volt, иерархия - не единственная возможная структура.
Например, бывают задачи, когда каждый элемент списка обязан
помнить, какому списку он принадлежит.
E-mail: alm43.alm43@gmail.com
alm43 вне форума Ответить с цитированием
Старый 19.04.2016, 18:26   #10
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Цитата:
Сообщение от alm43 Посмотреть сообщение
220Volt, иерархия - не единственная возможная структура.
Например, бывают задачи, когда каждый элемент списка обязан
помнить, какому списку он принадлежит.
Виртуальные функции нарушают иерархию. Если программа грамотно организована, то ничего кроме них нарушать не будет. А остальные перекрёсты от непродуманного проектирования. Но на 100% утверждать не буду (вывод на основе своего опыта, возможно ошибочен), я ведь не Страуструп.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C#] Сериализация списка классов (нескольких классов) vermond Помощь студентам 3 06.06.2015 23:10
Объявление классов или пространств имён Thez Общие вопросы C/C++ 1 12.03.2015 15:40
Объявление классов. Применение принципов ООП get Паскаль, Turbo Pascal, PascalABC.NET 0 26.05.2011 13:15
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
Лабораторная: объявление классов. Delphi 7 Stail Помощь студентам 1 02.11.2008 19:53