MQL5 O compilador não faz distinção entre uma classe e um ponteiro para ela - página 7

 
Alexey Navoykov:
Então você está propondo proibir completamente a nomeação implícita de indicadores? Não creio que muitas pessoas aqui ficariam felizes com isso.

Deixe que todos tenham uma escolha.

#property strict

Eu certamente não quero esse tipo de truque.

 
SemenTalonov:

Bem, isso é desnecessário dizer. Há um vazamento de memória.

Um vazamento de memória, você diz? Que tal isso? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

Um vazamento de memória, você diz? Que tal isso? )))


delete item;

Portanto, assume que o assunto está preparado para ser tratado dessa forma. Quantos prevêem essa possibilidade?

 
SemenTalonov:

Portanto, isto pressupõe que o objeto está preparado para ser tratado desta forma. Muitas pessoas prevêem tal possibilidade?

Acho que se alguém escreve a palavra new, deve saber exatamente onde a palavra correspondente delete está localizada em outro lugar em seu código.

 
Esta construção, a propósito, se um pouco refinada, é chamada de "coletor de lixo")))
 
SemenTalonov:

Deixe que todos tenham uma escolha.

Eu certamente não preciso de tais truques.

Já a utilizo na MQL4. Como funcionará então, se a sintaxe do idioma for a mesma?

Bem, como proteção contra tais ações, pode-se criar um método privado em uma classe:

class A
{
 private: void operator=(const A*);
}

Embora, francamente, eu não veja um problema aqui. Se você atribuir algo a um objeto de classe, você espera, a priori, que o operador de cópia seja chamado. Se você o quer, você o obtém. Que diferença faz se havia um ponteiro ou um objeto? O tipo de classe é o mesmo. Não se pode atribuir nenhuma classe para canhotos. É por isso que tudo parece mais um tédio ocioso.

O caso oposto, com o ponteiro à esquerda, é outra questão. Aí você poderia esperar atribuir algo ao ponteiro, mas acabou sendo a cópia de um objeto.

 
Alexey Navoykov:

O caso oposto, com o ponteiro à esquerda, é diferente. Aí você pode esperar atribuir algo ao ponteiro, mas acontece que você está copiando um objeto.

E você não pode proibir isto, caso contrário não poderá copiar o objeto quando realmente precisar.

Como resultado, você tem que deixar tudo como está. Esteja ciente do que você está fazendo.

 
fxsaber:

E você não pode proibi-lo, caso contrário, não poderá copiar o objeto quando realmente precisar.

No final, você tem que deixar as coisas como estão. Esteja ciente do que você está fazendo.

О! Isso é o principal.

Há muitas pessoas aqui que sabem como navegar nos modos de gerenciamento de memória? Compreender a diferença entre AUTOMÁTICO e DINÂMICO.

E ouviram algo sobre STATIC e BASED (embora isto não seja necessário).

 
fxsaber:

E você não pode proibi-lo, caso contrário, não poderá copiar o objeto quando realmente precisar.

No final, você tem que deixar as coisas como estão. Esteja ciente do que você está fazendo.

Por que não pode funcionar? Existem * e & operadores para converter para o que você precisa.
 
Alexey Navoykov:
Por que não pode funcionar? Existem * e & operadores para reduzi-lo ao que é necessário.

Onde existe um *?

Razão: