ООП для школьников. - страница 17

 
Artyom Trishkin:

Всё точно так же, как и с переменными.

И фокус:

а какой смысл в этом указателе, если trade доступна в функции OnTrade

#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 trade.Buy(0.1);
}
 
Alexey Viktorov:

а какой смысл в этом указателе, если trade доступна в функции OnTrade

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

Это был упрощённый пример ответа на твой вопрос о разнице и предпочтениях.

Знаешь, ты задаёшь вопросы со слишком простыми примерами, а когда тебе отвечают, ты задаёшь очередной - вполне резонный вопрос - "а нафига?"

Да потому, что твои примеры не нужно решать при помощи классов.

Тут два варианта - ты либо читаешь и вникаешь в то, что тебе отвечают, либо ... либо решаешь свои задачи процедурно. Тогда вопросов "нафига" не будет.

Теперь представь, что твой класс CTrade находится не в глобальной области видимости. И ?

Ещё представь, что таких объектов у тебя не один (как это практически во всех примерах в кодобазе), а столько, сколько символов ты вручную добавляешь/удаляешь из программы. И ?

 
Сергей Таболин:

В таком случае это 

некорректное описание? 

Я так понимал, что если устанавливается для эксперта, то любые ордера/позиции должны иметь этот магик. ((

Почему бы вдруг некорректное?

У одного эксперта может быть несколько магиков, и все его.

Даже в одном ulong-магике можно хранить один общий идентификатор эксперта+несколько магиков+несколько разных идентификаторов, и ещё останется много места.

 
Artyom Trishkin:

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

Это был упрощённый пример ответа на твой вопрос о разнице и предпочтениях.

Знаешь, ты задаёшь вопросы со слишком простыми примерами, а когда тебе отвечают, ты задаёшь очередной - вполне резонный вопрос - "а нафига?"

Да потому, что твои примеры не нужно решать при помощи классов.

Тут два варианта - ты либо читаешь и вникаешь в то, что тебе отвечают, либо ... либо решаешь свои задачи процедурно. Тогда вопросов "нафига" не будет.

Теперь представь, что твой класс CTrade находится не в глобальной области видимости. И ?

Ещё представь, что таких объектов у тебя не один (как это практически во всех примерах в кодобазе), а столько, сколько символов ты вручную добавляешь/удаляешь из программы. И ?

Нет Артём, я задаю вопросы для понимания, а не для применения. А когда ты предлагаешь решение идиотской задумки, тогда я и спрашиваю "А нафига?". Понимаешь, если я переспрошу по-своему и мне ответят правильно или неправильно я думаю, то всё что мне было сказано по этому поводу я уже не забуду и буду делать с пониманием, или с пониманием так делать не буду. У меня свои тараканы...))) Я не умею что-то делать без понимания. Я никогда не решал математические задачи просто по образцу решения. Не умею. У меня за год по окончании восьмого класса было 5 двоек и четвёрка по математике. Ну ничего, меня пустили на экзамены с условием, что если я сочинение напишу на тройку, то мне разрешать сдать зачёты, исправить двойки и меня отпустят в ГПТУ. А институт был гораздо позже. Там я и заболел программированием, но это преподавали исключительно для ознакомления поверхностно. А ООП в то время, мне кажется вообще, может только задумывали.

 
Alexey Viktorov:

Нет Артём, я задаю вопросы для понимания, а не для применения. А когда ты предлагаешь решение идиотской задумки, тогда я и спрашиваю "А нафига?". Понимаешь, если я переспрошу по-своему и мне ответят правильно или неправильно я думаю, то всё что мне было сказано по этому поводу я уже не забуду и буду делать с пониманием, или с пониманием так делать не буду. У меня свои тараканы...))) Я не умею что-то делать без понимания. Я никогда не решал математические задачи просто по образцу решения. Не умею. У меня за год по окончании восьмого класса было 5 двоек и четвёрка по математике. Ну ничего, меня пустили на экзамены с условием, что если я сочинение напишу на тройку, то мне разрешать сдать зачёты, исправить двойки и меня отпустят в ГПТУ. А институт был гораздо позже. Там я и заболел программированием, но это преподавали исключительно для ознакомления поверхностно. А ООП в то время, мне кажется вообще, может только задумывали.

Тогда странно, что ты вообще задал эти вопросы.

Ты же понимаешь в чём различие между переменными, объявленными в разных областях видимости. Понимаешь. А вопрос задаёшь как будто первый раз слышишь про области видимости переменных.

Когда тебе показывают как использовать указатель на ранее созданный объект, ты задаёшь странный вопрос - "зачем, если объект и так виден?". Так тебе показано было не как нужно делать, а как в том примере получить указатель и обращаться к объекту по указателю. И это уже будут не два разных объекта в разных областях видимости, а один.
А если объект не в глобальной области, а внутри какого-то другого объекта? И тот - другой объект - лишь возвращает тебе указатель на нужный объект CTrade. Вот тогда пример уже не вызовет вопроса "а нафига?". Думаю, что не вызовет. Но ведь это же можно и так подразумевать, что тебе отвечают именно с допущением, что ты понимаешь простоту своего примера, и опускаешь "за скобки" глобальную видимость объекта.

 
Artyom Trishkin:

Почему бы вдруг некорректное?

У одного эксперта может быть несколько магиков, и все его.

Даже в одном ulong-магике можно хранить один общий идентификатор эксперта+несколько магиков+несколько разных идентификаторов, и ещё останется много места.

Я понимаю. При торговом запросе можно указать любой магик. И один эксперт может хоть каждую новую позицию открывать с новым магиком. И я в свой магик кодирую и символ, и ТФ, и т.д.. Всё это понятно.

Только я был уверен, что SetExpertMagicNumber - это как глобальное решение. Если в торговом запросе явно не указывается магик, то он принимает значение установленное через  SetExpertMagicNumber. Иначе, лично я не вижу в нём смысла ))

 
Сергей Таболин:

Я понимаю. При торговом запросе можно указать любой магик. И один эксперт может хоть каждую новую позицию открывать с новым магиком. И я в свой магик кодирую и символ, и ТФ, и т.д.. Всё это понятно.

Только я был уверен, что SetExpertMagicNumber - это как глобальное решение. Если в торговом запросе явно не указывается магик, то он принимает значение установленное через  SetExpertMagicNumber. Иначе, лично я не вижу в нём смысла ))

Метод устанавливает магический номер не советнику, а объекту торгового класса. В одном эксперте может быть несколько торговых классов, и для каждого можно установить отдельный магик, который заключает в своём значении как общий магик для эксперта, так и отдельный магик - для каждого из торговых объектов.

 
Artyom Trishkin:

Тогда странно, что ты вообще задал эти вопросы.

Ничего странного. Если я вообще не понимаю ООП, то и не был уверен, или были некоторые сомнения, в том что я всё правильно понимаю. Спросил для уточнения, получил подтверждение и теперь уверен (в завтрашнем дне). Как в том монологе Г. Хазанова.

- Представьте себе, что вы стоите у окна, а в окне напротив, ничего не подозревая стоит обнажённая женщина. Что вы чувствуете?

- Уверенность в завтрашнем дне.

- и какие ваши дальнейшие действия?

- Перехожу в другую комнату. У меня там окно побольше.

 
Alexey Viktorov:

Я правильно понимаю, что при таком варианте

не учитывая предупреждение компилятора, позиция может открыться с магиком не 123 ?

То-есть в функции OnTick создастся новый объект и в нём магик не будет равен 123.

Позиция будет открыта с Magic number равным "0" - то есть строка

void OnTick()
{
 CTrade trade;

пересоздаёт объект заново, а при создании объекта торгового класс CTrade magic по-умолчанию (в конструкторе класса) инициализируется нулем:

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CTrade::CTrade(void) : m_async_mode(false),
   m_magic(0),
   m_deviation(10),
   m_type_filling(ORDER_FILLING_FOK),
   m_log_level(LOG_LEVEL_ERRORS)
 
Vladimir Karputov:

Позиция будет открыта с Magic number равным "0" - то есть строка

пересоздаёт объект заново, а при создании объекта торгового класс CTrade magic по-умолчанию (в конструкторе класса) инициализируется нулем:

Да? А разве не создаёт новый, независимый объект?