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

 

Модераторов прошу вынести все обсуждения в отдельную ветку. При чем таких веток с обсуждениями преимуществ ООП уже с десяток наверно. 

 
Alexey Viktorov:

Ещё один вопрос: В чём разница между объявлением переменной, получения\создания указателя, созданием экземпляра объекта. Точней не сама разница, а в каких случаях что лучше применять. Например для открытия позиции достаточно объявить переменную

А в каких случаях правильней использовать указатель, в каких случаях без экземпляра объекта не обойтись.

Какие плюсы и минусы имеют тот или иной способ?

1. Если объект в глобальной области видимости, это статический объект. Он размешается в статической памяти и существует пока существует программа.

Его конструктор вызывается перед вызовом первой функции программы. Деструктор вызывается после OnDeinit().

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


Например так:

if( ... )
{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

Или даже так:

{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

Он будет уничтожен при выходе из блока. При уничтожении вызывается деструктор.

Так как размер стека обычно ограничен, в стеке нельзя размещать очень большие объекты.

3. Объекты созданные при помощи оператора new, находятся в динамической памяти( куче ).
Они существуют пока не будут уничтожены явно, оператором delete.


Пример:

void func()
{
  Myclass* pObject = new MyClass();
}

В этом примере создаются две переменные. Объект класса MyClass в динамической памяти.

И переменная pObject - указатель на Myclass. Ей присваивается адрес объекта в динамической памяти.

При выходе из функции переменная pObject будет уничтожена, но объект в динамической памяти останется.

Для того чтобы была возможность его удалить, нужно где-то сохранить его адрес.

При их создании и уничтожении, также вызываются конструктор и деструктор.

Доступ к динамическим переменным обычно занимает больше времени чем к локальным.


Всё это Вы должны учитывать, когда создаёте какой-то объект.


 
Koldun Zloy:

1. Если объект в глобальной области видимости, это статический объект. Он размешается в статической памяти и существует пока существует программа.

...

И ведь никто ничего не скажет, даже ЗыКсперт.
 
Koldun Zloy:

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

#include <Trade\Trade.mqh>
CTrade trade;

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

void OnTick()
{
 CTrade trade;
 trade.Buy(0.1);
}

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

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

 
Alexey Viktorov:

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

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

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

SetExpertMagicNumber

 
Alexey Viktorov:

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

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

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

Да, правильно. Это два разных объекта. Так как локальный объект trade в OnTick имеет то же самое название, что и глобальный объект, то в функции OnTick возможен доступ только к нему. Глобальный объект оказался вне области видимости. Поэтому для локального объекта trade MagicNumber еще не установлен.

 
Alexey Viktorov:

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

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

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

void OnTick()
{
 CTrade trade;  // Объект № 2 в локальной области OnTick()
 trade.Buy(0.1);
}

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

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

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

И фокус:

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

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

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}
 
А зачем тогда вообще нужен этот SetExpertMagicNumber ?
 
Сергей Таболин:
А зачем тогда вообще нужен этот SetExpertMagicNumber ?

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

Всё зависит от понимания того, что, и как мы используем.

 
Artyom Trishkin:

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

Всё зависит от понимания того, что, и как мы используем.

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

SetExpertMagicNumber
Устанавливает идентификатор эксперта

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

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