ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 3

 
Алексей Тарабанов:

Вы нашли способ, как ее создать. 

Вы чего-то путаете.
 
Ilya Malev:

У Вас происходит попытка использовать статик-поле класса на этапе инициализации до того, как был создан хотя бы 1 экземпляр этого класса. На мой взгляд, это извращение... Вот так все работает нормально:

Принцип инкапсуляции вообще предполагает, что такие поля должны быть скрытыми, а не общедоступными.

Статик поле на то и статик, чтобы не зависеть от наличия экземпляров класса.  Но если хотите сначала создать экземпляр класса - ок, создайте, но только внутри функции.  И запросите у него это поле (хоть напрямую, хоть через метод) -  результат опять будет тот же самый.

 
Alexey Navoykov:
Вы чего-то путаете.

Нет, я ничего не путаю. 

 Сначала переменные глобального уровня, затем статические и потом локальные по мере их появления в коде.

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

Уберите static из своего примера и получите желаемый результат.

 
Алексей Тарабанов:

Нет, я ничего не путаю. 

 Сначала переменные глобального уровня, затем статические и потом локальные по мере их появления в коде.

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

Уберите static из своего примера и получите желаемый результат.

"Рекомендацию документации" )) Я с вас фигею.   Вы реально что ли до сих пор не поняли сути?  В языке баг. Сами разработчики об этом говорят, и объясняют вам, как нужно правильно плясать с бубнами, чтобы не напороться на этот баг.   Я же сделал так, чтобы забыть об этом баге раз и навсегда.
 
Alexey Navoykov:

Необязательно, но мне так удобней.  Если же это константа (а в глобальной видимости объявляются в основном константы, если код грамотный), то здесь и выбора другого нет.

На всё, что выделенно жёлтым, у меня один вопрос:  ЗАЧЕМ?   Я уже нашёл, как решить проблему.

ЗАТЕМ чтобы не городить тот огород который вы уже нагородили.

 
Alexey Navoykov:
"Рекомендацию документации" )) Я с вас фигею.   Вы реально что ли до сих пор не поняли сути?  В языке баг. Сами разработчики об этом говорят, и объясняют вам, как нужно правильно плясать с бубнами, чтобы не напороться на этот баг.   Я же сделал так, чтобы забыть об этом баге раз и навсегда.

Нельзя инициировать значение чего-нибудь функцией. Даже, если очень хочется. Неужто, непонятно? 

 
Alexey Navoykov:

Статик поле на то и статик, чтобы не зависеть от наличия экземпляров класса.  Но если хотите сначала создать экземпляр класса - ок, создайте, но только внутри функции.  И запросите у него это поле (хоть напрямую, хоть через метод) -  результат опять будет тот же самый.

Так у нас процедурное все таки или объектно-ориентированное программирование? С чего вдруг на этапе до инициализации выполнять не связанные с классами функции применительно к типизируемым объектам к тому же. Понимаю, что ответ "потому что так хочется". Но я бы на месте разработчиков не торопился отменять все дела и бежать исправлять это конкретное поведение, потому что это достаточно маргинальная архитектура и к тому же проблема легко решается созданием экземпляра класса. Не внутри функции, конечно.

 
Alexey Viktorov:

ЗАТЕМ чтобы не городить тот огород который вы уже нагородили.

Ну я ведь уже нагородил - и ни капельки не жалею )  А вам, я смотрю, прям доставляет удовольствие сковывать себя искусственными ограничениями, навязанными MQ.  Может вы мазохист? )   Да ещё и так настойчиво пытаетесь убедить меня, что именно так и нужно.  Это не нужно, это вынужденно.
 
Алексей Тарабанов:

Нельзя инициировать значение чего-нибудь функцией. Даже, если очень хочется. Неужто, непонятно? 

Да, непонятно.  Объясните.
 
Ilya Malev:

Так у нас процедурное все таки или объектно-ориентированное программирование? С чего вдруг на этапе до инициализации выполнять не связанные с классами функции применительно к типизируемым объектам к тому же. Понимаю, что ответ "потому что так хочется". Но я бы на месте разработчиков не торопился отменять все дела и бежать исправлять это конкретное поведение, потому что это достаточно маргинальная архитектура и к тому же проблема легко решается созданием экземпляра класса. Не внутри функции, конечно.

Т.е. вы сторонник массового использования глобальных переменных, как я понял.  Тогда мы с вами вряд ли поймём друг друга.

Более того, сама функция может быть шаблонной. И создаваемый экземпляр соответственно должен быть параметризован тем же типом:

template<typename T>
int f()
{  
  A<T> a;
  return a.f();
}

Ваши действия?