O POE para crianças em idade escolar. - página 16

 

Peço aos moderadores que coloquem todas as discussões em um fio à parte. Provavelmente há dúzias de tais linhas discutindo as vantagens do OOP.

 
Alexey Viktorov:

Mais uma pergunta: Qual é a diferença entre declarar uma variável, obter/criar um ponteiro, criar uma instância de objeto. Não é a diferença, mas em que casos é melhor usar. Por exemplo, é suficiente declarar uma variável para abrir uma posição.

E em que casos é melhor usar o ponteiro, e em que casos não podemos passar sem a instância do objeto.

Quais são os prós e os contras de um método ou de outro?

1. Se um objeto está no escopo global, é um objeto estático. É colocado na memória estática e existe enquanto o programa existir.

Seu construtor é chamado antes da chamada da primeira função do programa. O destruidor é chamado depois de OnDeinit().

2. Os objetos declarados dentro da função são objetos locais. Eles são colocados na pilha. Eles são destruídos ao sair da função.
Você pode declarar um objeto local dentro de um aparelho de amarrar.


Por exemplo, assim:

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

Ou mesmo assim:

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

Ela será destruída ao sair do bloco. Quando é destruído, o destruidor é chamado de destruidor.

Como o tamanho da pilha é geralmente limitado, objetos muito grandes não podem ser colocados na pilha.

3. Os objetos criados pelo novo operador estão em memória dinâmica (heap).
Eles existem até serem explicitamente eliminados pelo operador de eliminação.


Exemplo:

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

Neste exemplo, duas variáveis são criadas. Um objeto da classe MyClass em pilha.

E a variável pObjeto é um ponteiro para MyClass. A esta variável é atribuído o endereço do objeto em memória dinâmica.

Ao sair da função, a variável pObjeto será destruída, mas o objeto permanecerá na memória dinâmica.

Para poder apagá-lo, seu endereço deve ser armazenado em algum lugar.

Quando eles são criados e destruídos, o construtor e o destruidor também são chamados.

As variáveis dinâmicas normalmente levam mais tempo para serem acessadas do que as variáveis locais.


Você deve levar tudo isso em consideração ao criar um objeto.


 
Koldun Zloy:

1. Se um objeto está no escopo global, ele é um objeto estático. É colocado em memória estática e existe enquanto o programa existir.

...

E ninguém vai dizer nada, nem mesmo a ZyXpert.
 
Koldun Zloy:

Estou correto ao assumir que com esta opção

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

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

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

sem considerar o aviso do compilador, a posição pode abrir com um número mágico não igual a 123 ?

Ou seja, um novo objeto será criado na função OnTick e o mágico não será igual a 123 nele.

 
Alexey Viktorov:

Estou correto ao assumir que com esta opção

sem considerar o aviso do compilador, a posição pode abrir com um número mágico diferente de 123 ?

Ou seja, um novo objeto será criado na função OnTick e o mágico não será igual a 123 nele.

SetExpertMagicNumber

 
Alexey Viktorov:

Estou correto ao assumir que com esta opção

sem considerar o aviso do compilador, a posição pode abrir com um mágico não 123 ?

Ou seja, um novo objeto será criado na função OnTick e não terá um MagicNumber de 123.

Sim, isso é correto. Estes são dois objetos diferentes. Como o objeto local no OnTick tem o mesmo nome do objeto global, somente ele pode ser acessado na função OnTick. O objeto global está fora do escopo. Portanto, para o objeto de comércio local, o MagicNumber ainda não foi definido.

 
Alexey Viktorov:

Estou correto ao assumir que com esta opção

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

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

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

sem considerar o aviso do compilador, a posição pode abrir com um mágico não 123 ?

Ou seja, um novo objeto será criado na função OnTick e o mágico não será 123 nele.

É exatamente o mesmo que com as variáveis.

E foco:

#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);
}
 
Por que esteSetExpertMagicNumber é necessário em primeiro lugar?
 
Сергей Таболин:
Por que esteSetExpertMagicNumber é necessário em primeiro lugar?

Estabelece um número mágico para o objeto da classe comercial. Pode haver mais de um objeto de classe CTrade para todo o programa, como é feito agora em kodobase. Este é um objeto. Este objeto é utilizado para realizaroperações comerciais. Não há necessidade de criar um objeto para todo o programa e redefini-lo toda vez que um novo mágico, deslizamento e outros parâmetros que são definidos durante a inicialização precisam ser alterados. É possível criar um objeto comercial separado para cada símbolo comercial, estabelecer parâmetros necessários para ele de acordo com as propriedades do símbolo, ao qual pertence este objeto específico da classe CTrade, e negociar facilmente obtendo um ponteiro para o objeto necessário da classe comercial necessária a partir do símbolo necessário, sem sobrepor os parâmetros estabelecidos para isso.
Para trabalhar com outro mágico, pode ser definido um objeto comercial separado com configurações apropriadas. Pode haver vários feiticeiros em uma EA.

Tudo depende da compreensão do que e como o usamos.

 
Artyom Trishkin:

Ele estabelece um magik para um objeto da classe comercial. Não pode haver apenas um objeto da classe CTrade para todo o programa, como geralmente é feito em kodobase. Este é um objeto. Este objeto é utilizado para realizar operações comerciais. Não há necessidade de criar um objeto para todo o programa e redefini-lo toda vez que um novo mágico, deslizamento e outros parâmetros que são definidos durante a inicialização precisam ser alterados. É possível criar um objeto comercial separado para cada símbolo comercial, estabelecer parâmetros necessários para ele de acordo com as propriedades do símbolo, ao qual pertence este objeto específico da classe CTrade, e negociar facilmente obtendo um ponteiro para o objeto necessário da classe comercial necessária a partir do símbolo necessário, sem sobrepor os parâmetros estabelecidos para isso.
Para trabalhar com outro mágico, pode ser definido um objeto comercial separado com configurações apropriadas. Afinal de contas, pode haver vários feiticeiros em uma EA.

Tudo depende da compreensão do que e como o usamos.

Nesse caso, é o

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

descrição incorreta?

Meu entendimento era que, se definido para a EA, então quaisquer ordens/posições deveriam ter este magik. ((

Razão: