Erros, bugs, perguntas - página 1357

 
A propósito, não entendo este código, onde será chamado o operador===? Ele apenas compara dois anseios, só isso
 
Alexey Navoykov:
A propósito, não entendo este código, em que lugar será chamado operator===? É apenas uma comparação de dois longos, é tudo
class A { public:
        bool operator==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart()
{
        bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
IsEqualPointer pode ser ou um modelo ou uma função geral semelhante a ::GetPointer
 
A100:

...

IsEqualPointer pode ser ou um padrão ou uma função geral semelhante a ::GetPointer

Não o compreendo de todo, poderia explicar em linguagem humana o que está a tentar fazer? O código dado tem erros (operador== não tem argumento, nem valor de retorno), é difícil de compreender algo de tudo isto.

Deixe-me dizer-lhe desde já que o problema da comparação/atribuição de apontadores nunca existiu antes, GetPointer(a)==GetPointer(b) é suficiente para isso. Assim, a tarefa diz respeito apenas à comparação/atribuição dos próprios objectos, ou seja, é garantido que estas operações serão realizadas, independentemente de estes objectos serem representados por apontadores ou referências

 
Alexey Navoykov:

O código que deu tem erros (operator=== não tem qualquer argumento ou valor de retorno), é difícil de entender alguma coisa de tudo isto.

Corrigido. Sugere-se chamar operator==(...) para apontadores também, se for definido, então GetPointer(a)==GetPointer(b) fará com que a.operator==( b ) seja chamado, por isso para comparar apontadores para igualdade sugere-se usar IsEqualPointer
 
A100:
GetPointer(a)==GetPointer(b) irá causar a.operator==( b )
Porque o faria?
 
Alexey Navoykov:

A propósito, que tal introduzir * e & operadores em MQL para permitir o acesso explícito a um objecto no primeiro caso, e levar um ponteiro de objecto no segundo (em vez do pesado GetPointer). O asterisco é uma obrigação, e não há nada na língua que o substitua.Sem ele, é impossível controlar situações como a descrita por A100 acima, quando em vez dos próprios objectos são executadas algumas acções de ponteiro. Pessoalmente, este é um problema constante, tenho de estar constantemente alerta ou especificar A.operator=(B), A.operator!=(B) em todo o lado, ou seja, perde-se a brevidade, e os operadores de sobrecarga tornam-se de facto inúteis.

Já levantei este problema uma vez, mas o assunto ficou parado. Vamos finalmente terminar esta questão.

Obrigado pela mensagem, se se estiver a referir à seguinte utilização:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

Concordo com isso, levantarei definitivamente a questão e discuti-la-emos.
 
Alexey Navoykov:
Porque seria?
class A { public:
        bool operator ==( const A& ) { Print( __FUNCSIG__ ); return true; }
        bool operator  <( const A& ) { Print( __FUNCSIG__ ); return true; }
};
void OnStart()
{
        bool res;
        A a1, a2;
        res = GetPointer( a1 ) == GetPointer( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer( a1 )  < GetPointer( a2 ); //вызывается operator<
}
Se equacionar operator== com operator<, o resultado é o mesmo
 
A100:
...
Se equiparar operator== com operator<, o resultado também será o mesmo.

Nem sequer verificou o que sugeriu! Tal como no caso anterior, quando havia erros óbvios no código, ou seja, nem sequer tentou compilá-lo. Desenhou algo numa manivela, alguns pensamentos seus, como "coma-o enquanto eu sou gentil, sem piedade"... Não vamos fazer este tipo de disparate.

Eu próprio comparo constantemente indicadores e operadores de sobrecarga, e nunca aconteceu aquilo com que sonha agora. E agora que verificou o seu código, nenhum milagre aconteceu, operator=== não é executado como deveria ser.

 
Alexey Navoykov:

Assim, agora que verificou o seu código, não aconteceram milagres, o operador=== não começa como deveria.

A essência da proposta é precisamente que ela deve funcionar. Estou a falar de alterações ao sistema existente.
 
A100:
O objectivo da frase é precisamente o de a desencadear.

Para que serve isso? Está de cabeça para baixo.

Faz mais sentido o contrário: < e > deve causar a comparação de apontadores.