Discussão do artigo "Usando os Ponteiros de Objeto no MQL5" - página 2

 

Boa tarde. Sou iniciante. Tenho uma dúvida com relação ao uso do ícone "*" (asterisco).

No arquivo samplelist:

class CListItem
  {
private:
   int               ID;
   CListItem        *next;
   CListItem        *prev;

"*" é usado para declarar um ponteiro para um objeto - isso é meio claro.

Em seguida:

public:
                    ~CListItem();
   ...
   CListItem*        next(){return(next);}
   CListItem*        prev(){return(prev);}

Não está claro para que o sinal "*" é usado.

De acordo com a ajuda,"é possível criar dinamicamente objetos de um tipo complexo. Isso é feito com a ajuda do novo operador." O novo operador não é usado aqui. Explique com mais detalhes como e em quais casos o sinal "*" pode ser usado.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
kogriv:

Além disso, no entanto:

Não está claro o que o sinal "*" colocado ali significa.


Você pode escrever assim

public:
                    ~CListItem();
   ...
   CListItem        *next(){return(next);}
   CListItem        *prev(){return(prev);}

Não haverá diferença, trata-se apenas do estilo de design e de uma pequena abordagem ideológica.

 
Rosh:

Você pode escrevê-lo da seguinte forma

Não haverá diferença, apenas no que diz respeito ao estilo de design e a uma pequena abordagem ideológica.

Ou seja.

CListItem        *next(){return(next);}

essa é uma declaração de um ponteiro para o objeto (ou método?) next()? E depois, entre colchetes, o próprio objeto next é retornado? Entendi corretamente?

Entendo que tudo deve ser muito simples, mas, como nunca encontrei OOP antes, estou vagando em três pinheiros. Por favor, me faça entender.

 
kogriv:

Ou seja.

é uma declaração de um ponteiro para o objeto (ou método?) next()?

Ele diz que a função next() retorna um ponteiro para uma variável da classe CListItem.
 
kogriv:

E, em seguida, entre chaves, o próximo objeto é retornado? Entendi corretamente?

O corpo da função é fornecido entre chaves,

{return(next);}

isso significa que a função retornará a variável next, que tem o tipo de um ponteiro para um objeto da classe CListItem. Isso geralmente está de acordo com o tipo da função.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Logo após o primeiro exemplo, o artigo contém a frase "A variável pstatus é um ponteiro de um objeto, mas nós deliberadamente "esquecemos" de criar o próprio objeto usando o operador new e o passamos como parâmetro para a função PrintStatus()".

1. Não está claro o que "exatamente" você passou - um ponteiro ou um objeto?

2. Não há nenhuma função PrintStatus() no exemplo.

[Excluído]  

Acho que há um erro:

//+------------------------------------------------------------------+
//| adicionar um item à lista|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- primeiro verifique a exatidão do ponteiro passado
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- aumentar a contagem de itens na lista
   m_counter++;
//--- se ainda não houver itens na lista
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- definir o item como o ponteiro do objeto anterior----------------------- Início do erro-----------------------
      item.prev(first);
      //--- lembre-se do ponteiro do primeiro elemento atual
      CListItem *p=first;
      //--- colocar o item de entrada no lugar do primeiro item
      first=item;
      //--- definir o ponteiro do próximo objeto para o primeiro elemento da lista
      first.next(p);
     }
  } 
Parece que o novo elemento da lista tem prev e first referenciando o segundo elemento, e o segundo elemento não recebe uma referência ao primeiro elemento.
 
Yedelkin:

Logo após o primeiro exemplo, o artigo contém a frase "A variável pstatus é um ponteiro de objeto, mas nós deliberadamente "esquecemos" de criar o próprio objeto com o operador new e o passamos como parâmetro para a função PrintStatus()".

1. Não está claro o que exatamente foi passado - um ponteiro ou um objeto?

2. Não há nenhuma função PrintStatus() no exemplo.

Antes tarde do que nunca. Obrigado, corrigido no artigo. O final da frase foi removido

Logo após o primeiro exemplo, o artigo contém a frase "A variável pstatus é um ponteiro de um objeto, mas nós deliberadamente "esquecemos" de criar o próprio objeto usando o operador new e o passamos como um parâmetro para a função PrintStatus()".

 
220Volt:

Acho que há um erro:

Parece que o novo elemento da lista tem prev e first referenciando o segundo elemento, e o segundo elemento não recebe uma referência ao primeiro elemento.

Sim, há um erro de digitação. Em vez de

 else
     {
      //--- definir item  указатель предыдущего объекта                                         
      item.prev(first);

deve ser

else
     {
      //--- definido para o primeiro указатель предыдущего объекта
      first.prev(item);
corrigido.
[Excluído]  

Ainda não entendi o que são ponteiros e referências na MQL5 e agora na MQL4. Qual é a diferença entre passar por referência e ponteiro, exceto pelo código extra? Existe uma diferença no C++, mas qual é a diferença aqui? Se não for difícil, por favor, escreva informações mais detalhadas.