Ошибки, баги, вопросы - страница 1057

 
Zloy_Koldun:

Кошелёк это всего лишь частный случай. И никто не мешает поместить его в приватную часть.

В другом случае может понадобиться доступ к переменной родительского класса чужого объекта.

И это должен программист решать, разрешать или нет. А компилятор должен обеспечить корректную работу программы. 

В том-то и дело, если у Вас возникает этот самый другой случай, то значит Ваша архитектура концептуально неверна и потенциально опасна.

В С++ в свое время была введена неудачная концепция т.к. называемых дружественных классов. Типа если один класс знает как устроен другой, то он вполне безопасно может работать с его внутренними данными. Практика использования тысячами программистов по всему миру показала что это опасная вещь, создающая больше проблем, чем решающая, поэтому в современных языках вроде Java и C# от нее отказались.

 
C-4:
Эта особенность неприятно удивила. Однозначно это херь полная, если компилятор позволяет менять приватное поле чужого экземпляра. Надо бы в сервисдеск запостить.
Они под плюсы равняются.  А там тоже так.
 
Zloy_Koldun:

Я не пойму: вы для чего так хотите сами себя ограничить?

Думаете от этого ваша программа автоматически станет безопаснее?

Не станет! Скорее даже наоборот.

Именно лишние ограничения заставят вас когда-нибудь написать так:

Дружище, вижу ты кое-что знаешь в ООП, но вот его сути пока не улавливаешь.

Смотри:

///
/// Класс - меценат. Любой желающий может взять из его кошелька сколько хочет.
/// Если у нас монополия на меценатов, и он может быть только один, объявляем класс статическим
/// (на его работу это никак не повлияет).
///
class Меценат
{
    public:
      /// Отдает нужное количество денег
      int GetMoney(int СколькоДенегВзять)
      {
          кошелек -= СколькоДенегВзять;
          return СколькоДенегВзять;
      }
    private:
       int кошелек;
};
Удивительно, что я закрыл переменную "кошелек", не смотря на то, что изначально идея класса в том, что бы сделать его кошелек доступный всем? Но если все будут брать сколько непопадя можно уйти в минус, а это невозможно. Сейчас функция GetMoney это позволяет, но стоит добавить несколько строк, и она уже не позволит взять большее количество денег что хранит кошелек. А теперь представь, что к классу "Меценат" обращаются десятки различных объектов с просьбой дать денег. В случае если переменная кошелек будет открыта, то каждому из этих объектов, также придется контролировать (т.е. иметь свою собственную реализацию) проверку на наличие достаточного количества денег. А если хотя бы в одном из них ее не будет, он рискуют вместо нуля получить отрицательное значение, что в итоге будет означать, что он попросил денег а в результате оказался еще и должен.
 
C-4:

Дружище, вижу ты кое-что знаешь в ООП, но вот его сути пока не улавливаешь.

Смотри:

Удивительно, что я закрыл переменную "кошелек", не смотря на то, что изначально идея класса в том, что бы сделать его кошелек доступный всем? Но если все будут брать сколько непопадя можно уйти в минус, а это невозможно. Сейчас функция GetMoney это позволяет, но стоит добавить несколько строк, и она уже не позволит взять большее количество денег что хранит кошелек. А теперь представь, что к классу "Меценат" обращаются десятки различных объектов с просьбой дать денег. В случае если переменная кошелек будет открыта, то каждому из этих объектов, также придется контролировать (т.е. иметь свою собственную реализацию) проверку на наличие достаточного количества денег. А если хотя бы в одном из них ее не будет, он рискуют вместо нуля получить отрицательное значение, что в итоге будет означать, что он попросил денег а в результате оказался еще и должен.
Я против приватного кошелька ничего не имел. Разговор начался вот с этого:https://www.mql5.com/ru/forum/1111/page1072#comment_589657
 
Zloy_Koldun:
Я против приватного кошелька ничего не имел. Разговор начался вот с этого:https://www.mql5.com/ru/forum/1111/page1072#comment_589657
Все правильно. Класс B обращается к внешнему классу А и хочет что бы защищенные переменные класса А были ему доступны. Где здесь логика не понимаю.
 
C-4:
Все правильно. Класс B обращается к внешнему классу А и хочет что бы защищенные переменные класса А были ему доступны. Где здесь логика не понимаю.
Причём здесь логика.  Хочется же..!
 
MetaDriver:
Причём здесь логика.  Хочется же..!

http://alenacpp.blogspot.com/2006/03/blog-post_11.html

protected модификатор та еще шлюха. Редко когда он действительно нужен.

Труъ инкапсуляция предполагает приватность данных.

Права доступа при наследовании
  • 2006.03.11
  • alenacpp.blogspot.com
С правами доступа при наследовании довольно легко запутаться. Мало того, что для данных и функций класса в С++ есть целых три уровня доступа: , и , еще ведь можно и само наследование сделать , и . Самым загадочным их них является -наследование. Запутаться во всем этом зоопарке очень просто, поэтому я аккуратно расписала где какой уровень досупа...
 
Подскажите, чтобы через SymbolName() выбрать самый первый символ - в pos надо поставить 1 или 0? Там индексация как в массивах?
 
paladin800:
Подскажите, чтобы через SymbolName() выбрать самый первый символ - в pos надо поставить 1 или 0? Там индексация как в массивах?
Так проверить легко: Print.
 
paladin800:
Подскажите, чтобы через SymbolName() выбрать самый первый символ - в pos надо поставить 1 или 0? Там индексация как в массивах?
Да, от нуля.
Причина обращения: