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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2022, 21:45   #1
Huseyn AX
Пользователь
 
Регистрация: 14.11.2021
Сообщений: 43
По умолчанию Дружественные классы в C++

Если создать взаимно дружественные классы, можно ли их ограничить так: например создали класс A и B, и внутри A мы сделали дружественными только некоторые функции-элементы от B, а у B внутри мы сделали дружественными только некоторые функции-элементы от A.Какие то проблемы будут ?
Huseyn AX вне форума Ответить с цитированием
Старый 11.11.2022, 00:25   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

На сколько я понял при объявлении дружественным целый класс, доступны будут все функции. Елинственное чего я не понял, так это вообще назначение этих самых друзей. В С++ точно есть ООП?
Valick вне форума Ответить с цитированием
Старый 11.11.2022, 07:48   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Huseyn AX, можно отдельные функции задружить:
Код:
#include <iostream>

class A
{
public:
    void f1();
};

class B
{
    friend void A::f1();
public:
    void f1()
    {
    }
private:
    void f2()
    {
    }
};

void A::f1()
{
    B{}.f1();
    
    //доступ к приватному методу класса B
    B{}.f2();
}

int main()
{
}

Valick, а какая связь ООП с доступом к полям и методам? ООП можно и на чистом Си, и на ассемблере замутить
Алексей1153 вне форума Ответить с цитированием
Старый 11.11.2022, 07:51   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Елинственное чего я не понял, так это вообще назначение этих самых друзей
в подавляющем большинстве случаев причина - ошибка проектирования. Но если стоит выбор - срочно переделывать рабочий код или просто аккуратно подставить friend, то понятно, что программист выбирает. Но потом, в спокойной обстановке, неплохо бы произвести рефакторинг
Алексей1153 вне форума Ответить с цитированием
Старый 11.11.2022, 09:23   #5
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Valick, а какая связь ООП с доступом к полям и методам?
Без инкапсуляции нет ООП.

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
в подавляющем большинстве случаев причина - ошибка проектирования.
Это где-то описано? А ещё интересуют случаи которые не в большинстве. Есть ли такие обстоятельства при которых невозможно написать код без использования дружественных функций?

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Но потом, в спокойной обстановке, неплохо бы произвести рефакторинг
Конечно, плохой код мешал вашей работе. Почему же вы писали его? Пытались
поскорее решить задачу? Торопились? Возможно. А может быть, вам казалось,
что у вас нет времени качественно выполнить свою работу; что ваше начальство
будет недовольно, если вы потратите время на чистку своего кода. А может, вы
устали работать над программой и вам хотелось поскорее избавиться от нее. А мо-
жет, вы посмотрели на список запланированных изменений и поняли, что вам
необходимо поскорее «прикрутить» этот модуль, чтобы перейти к следующему.
Такое бывало с каждым.
Каждый из нас смотрел на тот хаос, который он только что сотворил, и решал
оставить его на завтра. Каждый с облегчением видел, что бестолковая программа
работает, и решал, что рабочая мешанина — лучше, чем ничего. Каждый *обещал
себе вернуться и почистить код… потом. Конечно, в те дни мы еще не знали закон
Леблана: потом равносильно никогда.
Роберт Мартин - Чистый код
Valick вне форума Ответить с цитированием
Старый 11.11.2022, 09:34   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Без инкапсуляции нет ООП.
в ассемблере и Си нет никакой инкапсуляции, но ООП там применять возможно. Инкапсуляция может быть просто правилом, хотя и не поддерживаемым компилятором

Цитата:
Сообщение от Valick Посмотреть сообщение
Это где-то описано
кхм... А как же абзацем выше утверждение про необходимость инкапсуляции?
Может, и описано где-то. У меня это следует из опыта

Цитата:
Сообщение от Valick Посмотреть сообщение
А ещё интересуют случаи которые не в большинстве
например, локальный или приватный класс-помощник в другом классе

Цитата:
Сообщение от Valick Посмотреть сообщение
плохой код мешал вашей работе. Почему же вы писали его?
у меня так бывало в основном из-за отсутствия нужных знаний на момент написания первого варианта кода А через год туда смотришь - мамамия! А кто это сдееелал!
Алексей1153 вне форума Ответить с цитированием
Старый 11.11.2022, 09:46   #7
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 493
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Инкапсуляция может быть просто правилом, хотя и не поддерживаемым компилятором
сама по себе сущность дружественной функции - это нарушение этого правила

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
А через год туда смотришь - мамамия!
а в коде сплошные классы "помошники"

Нет класс помошник за отмаз не катит, можно его нормально внедрить через интерфейсы и будет порядок.
Valick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дружественные классы KT82 Общие вопросы C/C++ 9 09.02.2016 19:20
Дружественные классы эллипс и круг dkii Общие вопросы C/C++ 21 04.03.2014 08:50
дружественные классы zla9_kolu4ka Общие вопросы C/C++ 15 28.02.2014 16:53
Дружественные классы и protected Stiker Помощь студентам 1 10.01.2013 00:57
Дружественные функции и классы Opiym Помощь студентам 1 05.04.2010 21:51