photo
+ Responder ao Tópico
Resultados de 1 a 1 de 1

Thread: Ponteiros de Objeto

  1. #1 Fechar a publicação
    Senior Member usuarioforum's Avatar usuarioforum's Avatar
    Data de afiliação
    Aug 2018
    Postagens
    579
    Obrigado
    166
    Agradecimentos 609 Tempos em 367 Postagens
    AssinarAssinar
    subscritar: 0

    Ponteiros de Objeto

    Em MQL5, existe a possibilidade de dinamicamente criar objetos de tipo complexo. Isso é feito por meio do operador new, que retorno um descritor do objeto criado. Descritores têm 8 bytes de tamanho. Sintaticamente, descritores de objeto em MQL5 são similares aos ponteiros em C++.

    Exemplos:

    MyObject* hobject= new MyObject();

    Em contraste com o C++, a variável hobject do exemplo acima não é um ponteiro para memória, mas sim um descritor de objeto. Além disso, no MQL5 todos os objetos em parâmetros de função devem ser passados por referência. Abaixo estão exemplos de passar objetos como parâmetros da função:

    class Foo
    {
    public:
    string m_name;
    int m_id;
    static int s_counter;
    //--- construtores e desconstrutores
    Foo(void){Setup("noname");};
    Foo(string name){Setup(name);};
    ~Foo(void){};
    //--- inicializar objetos do tipo Foo
    void Setup(string name)
    {
    m_name=name;
    s_counter++;
    m_id=s_counter;
    }
    };
    int Foo::s_counter=0;
    //+------------------------------------------------------------------+
    //| Função de início do programa script |
    //+------------------------------------------------------------------+
    void OnStart()
    {
    //--- Declarar um objeto como variável com sua criação automática
    Foo foo1;
    //--- Variante para passar um objeto por referência
    PrintObject(foo1);

    //--- Declarar um ponteiro para um objeto e criá-lo usando o operador 'novo'
    Foo *foo2=new Foo("foo2");
    //--- Variante para passar um ponteiro para um objeto por referência
    PrintObject(foo2); // ponteiro para um objeto é convertido automaticamente pelo compilador

    //--- Declarar um array de objetos do tipo Foo
    Foo foo_objects[5];
    //--- Variante de passagem de um array de objetos
    PrintObjectsArray(foo_objects); // Função separada para passar um array de objetos

    //--- Declarar um array de ponteiros para objetos do tipo Foo
    Foo *foo_pointers[5];
    for(int i=0;i<5;i++)
    {
    foo_pointers[i]=new Foo("foo_pointer");
    }
    //--- Variante para passar um array de ponteiros
    PrintPointersArray(foo_pointers); // Função separada para passar um array de ponteiros

    //--- É obrigatório excluir objetos criados como ponteiros antes da terminação
    delete(foo2);
    //--- deletar array de ponteiros
    int size=ArraySize(foo_pointers);
    for(int i=0;i<5;i++)
    delete(foo_pointers[i]);
    //---
    }
    //+------------------------------------------------------------------+
    //| Os objetos são sempre passados por referência |
    //+------------------------------------------------------------------+
    void PrintObject(Foo &object)
    {
    Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
    }
    //+------------------------------------------------------------------+
    //| Passando um array de objetos |
    //+------------------------------------------------------------------+
    void PrintObjectsArray(Foo &objects[])
    {
    int size=ArraySize(objects);
    for(int i=0;i<size;i++)
    {
    PrintObject(objects[i]);
    }
    }
    //+------------------------------------------------------------------+
    //| Passando um array de ponteiros para objeto |
    //+------------------------------------------------------------------+
    void PrintPointersArray(Foo* &objects[])
    {
    int size=ArraySize(objects);
    for(int i=0;i<size;i++)
    {
    PrintObject(objects[i]);
    }
    }
    //+------------------------------------------------------------------+

    Though trading on financial markets involves high risk, it can still generate extra income in case you apply the right approach. By choosing a reliable broker such as InstaForex you get access to the international financial markets and open your way towards financial independence. You can sign up here.


  2. The Following User Says Thank You to usuarioforum For This Useful Post:

    Não registrado (1 )

+ Responder ao Tópico

Permissões de postagens

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts