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

 
SemenTalonov:

Era o que eu esperava a cópia... O construtor de cópias padrão não é um erro.

MasDmitry diz que um novo objeto será alocado na memória e um ponteiro do tipoPOINTER_AUTOMÁTICO será devolvido.

Todos entendem as peculiaridades da MQL à sua maneira)

Sim. Acontece que não há Natal Pai.

Eu não escrevi sobre nenhum objeto em memória.

OK, houve disputas uma vez sobre como distinguir uma referência de um ponteiro. Mas agora parece que não podemos distinguir um objeto de um ponteiro.

 
Dmitry Fedoseev:

De onde vem uma cópia de um objeto? Uma cópia de um ponteiro, sim, mas apontando para o mesmo objeto.

Temos uma variedade de objetos. Um operador de atribuição é chamado sobre o primeiro elemento desta matriz, que é passado o objeto criado separadamente (embora, o operador não seja declarado). O que você acha que deveria estar no primeiro elemento da matriz depois disso? Na minha opinião, o objeto deve permanecer.

 
SemenTalonov:

Meu argumento é que um construtor de cópias explicitamente declarado não mudaria nada neste teste.

Como não ver o óbvio...

Um item da matriz de objetos contém um ponteiro e um objeto no item da matriz de ponteiro... isso é realmente normal?

No primeiro caso, um ponteiro de objeto vai para a matriz no segundo caso, o construtor de cópias deve funcionar, como essas operações podem ser equivalentes?

Não o construtor de cópias, mas o operador da tarefa, mas essas são as pequenas coisas.

É o objeto que deve entrar em um elemento de uma matriz de objetos.

No primeiro caso - você tem exatamente uma matriz de objetos, que tipo de "indicadores"?

 
Georgiy Merts:

Temos uma variedade de objetos. O operador de atribuição é chamado no primeiro elemento desta matriz e o objeto criado separadamente é passado para ele. O que você acha que deveria estar no primeiro item desta matriz depois disso? Na minha opinião, o objeto deve permanecer.

А... Não é nada bom lá)))) Conjunto de apontadores automáticos, e nele também se enfiam os objetos criados dinamicamente. Depois há 3 objetos, dois deles serão automaticamente apagados e um vazará. Se for compilado.

 

Deveria ser assim:

A* m_A[2];

e assim:

m_A[0] =GetPointer(a); 
 

E, no final, é assim:

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А... Não é nada bom lá)))) Um conjunto de indicadores automáticos, e também se enfiam em um objeto que é criado de forma dinâmica.

Finalmente!))

Georgiy Merts:

É o objeto que deve ser colocado no elemento da matriz de objetos.

No primeiro caso - você tem exatamente um conjunto de objetos, que "indicações"?

Esse é o meu ponto ! Por que funciona?!

m_A[1] = new A();
 
SemenTalonov:

Finalmente!))

Esse é o meu ponto! Por que está Trabalhando?!

Se A for declarado como tal:

A* m_A[2]; 

Então está tudo bem.

E se for declarado desta forma:

A m_A[2]; 

Não deve ser compilado. Ou há um bug no compilador, ou o compilador não tem que pensar por todos.

 
Provavelmente não é um bug, mas a atribuição de objetos simples deve funcionar, então você tem que cuidar de apagar o objeto que você criou com novo.
 
Dmitry Fedoseev:

Então não deve ser compilado. Ou há um bug no compilador, ou o compilador não tem que pensar por todos.

Bingo!

SemenTalonov2019.01.10 07:36POINTER_AUTOMÁTICO a um ponteiro do tipoPOINTER_DYNAMIC e vice versa.