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

 
Andrey Barinov:

?

у него в примере модификатор static, если убрать, то компилятор выдаст как положено предупреждение

к статику можно из любого участка кода обратиться через оператор разрешения контекста... вообще из любого! (области видимости не помню, давно не проверял,но скорее всего будет глобальная как будто описана в самом верху кода, т.е. не важно где статик метод / поле объявили)

 
Igor Makanu:

к статику можно из любого участка кода обратиться через оператор разрешения контекста... вообще из любого! (области видимости не помню, давно не проверял,но скорее всего будет глобальная как будто описана в самом верху кода, т.е. не важно где статик метод / поле объявили)

Это давно вдруг так стало :)?

К статикам применимы все те же правила (private, protected, public), просто они не требуют создания объекта.

Тут очевидный баг.

 
Andrey Barinov:

Это давно вдруг так стало :)?

не знаю, могу точно утверждать, что пару месяцев назад админ @Ilyas объяснял порядок инициализации статиков, причем упомянул, что статик методы и статик поля инициализируются вместе с глобальными переменными при запуске MQL-программы...дальше поиском по его сообщениям

Andrey Barinov:

К статикам применимы все те же правила (private, protected, public), просто они не требуют создания объекта.

Тут очевидный баг.

спорить не готов и не хочу, но тексту справки поведение статик методов соответствует

ну и имхо, которое не считаю нужным подтверждать аргументами - MQL большими шагами в строну поведения программ на C# движется,там похожая ситуация, как и если программист принимает решение использовать оператор разрешения контекста ,значит он осознанно отказывается от помощи компилятора по выявления нарушения целостности данных в классе, существуют классические способы получения методов и полей без оператора разрешения контекста


UPD:  понемногу решил переписать свою библиотеку MQL, с ужасом замечаю, что пишу как видел в популярных кодах на MQL имена методов и полей совпадающих с именами зарезервированных слов...имхо это тоже шаг в сторону отказа от помощи компилятора при "разваливании" зависимостей.... кактотак )))

 

Igor Makanu:

как и если программист принимает решение использовать оператор разрешения контекста ,значит он осознанно отказывается от помощи компилятора по выявления нарушения целостности данных в классе, существуют классические способы получения методов и полей без оператора разрешения контекста

эээ по-моему вы перекурили ООП, отдохните, а потом со свежей головой. оператор разрешения контекста определяет видимость, но никак не влияет на доступ.

 
TheXpert:

эээ по-моему вы перекурили ООП, отдохните, а потом со свежей головой. оператор разрешения контекста определяет видимость, но никак не влияет на доступ.

ну я как бы сам решу, что курить и когда отдыхать )))

ЗЫ: фокусов всегда много в любом языке с доступом к содержимому памяти, хабр почитываю там в комментах регулярные терки то питону.то по С++,  еще раз - есть более гуманные способы работы с полями и методами, если решил, что так быстрее, ну значит не греши на то, что в итоге получишь - во всех компиляторах всегда можно было влезть куда не следует )))

 
Igor Makanu:

не знаю, могу точно утверждать, что пару месяцев назад админ @Ilyas объяснял порядок инициализации статиков, причем упомянул, что статик методы и статик поля инициализируются вместе с глобальными переменными при запуске MQL-программы...дальше поиском по его сообщениям

спорить не готов и не хочу, но тексту справки поведение статик методов соответствует

"private – разрешает доступ к переменным и методам класса только из методов данного класса.

В каком месте не понятно слово "только"?

OnStart не является методом класса А, согласно примеру.

 
Aliaksandr Hryshyn:

"private – разрешает доступ к переменным и методам класса только из методов данного класса.

В каком месте не понятно слово "только"?

OnStart не является методом класса А, согласно примеру.

речь не о модификаторе private, а о модификаторе static - сделайте тесты и увидите как в MQL ведет себя static

 
Igor Makanu:

не знаю, могу точно утверждать, что пару месяцев назад админ @Ilyas объяснял порядок инициализации статиков, причем упомянул, что статик методы и статик поля инициализируются вместе с глобальными переменными при запуске MQL-программы...дальше поиском по его сообщениям

спорить не готов и не хочу, но тексту справки поведение статик методов соответствует

ну и имхо, которое не считаю нужным подтверждать аргументами - MQL большими шагами в строну поведения программ на C# движется,там похожая ситуация, как и если программист принимает решение использовать оператор разрешения контекста ,значит он осознанно отказывается от помощи компилятора по выявления нарушения целостности данных в классе, существуют классические способы получения методов и полей без оператора разрешения контекста


UPD:  понемногу решил переписать свою библиотеку MQL, с ужасом замечаю, что пишу как видел в популярных кодах на MQL имена методов и полей совпадающих с именами зарезервированных слов...имхо это тоже шаг в сторону отказа от помощи компилятора при "разваливании" зависимостей.... кактотак )))

https://pikabu.ru/story/nevozmozhno_tak_nevozmozhno_2129852
 

?

странная ситуация, со стаитиками давно работает все вне класса. а я тут распинаюсь.... ради прикола воспроизведите у себя код:

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{}
//+------------------------------------------------------------------+

Вы видите экземпляр объекта? ... а он есть в MQL ;)

ЗЫ: причем есть на уровне справки... ко мне какие претензии?  

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Отсутствие возможности объявлять статически члены класса привело бы к необходимости объявлять эти данные на глобальном уровне программы. Это разорвало бы отношения между данными и их классом, а также не согласуется с основной парадигмой ООП – объединение в классе данных и методов для их обработки. Статический член позволяет данным класса, которые не специфичны для отдельного экземпляра, существовать в области видимости класса.