Erreurs, bugs, questions - page 1357

 
Alexey Navoykov:
Au fait, je ne comprends pas ce code, à quel endroit l'opérateur== sera-t-il appelé ? C'est juste une comparaison de deux longs, c'est tout.
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 peut être soit un modèle, soit une fonction générale similaire à ::GetPointer
 
A100:

...

IsEqualPointer peut être soit un motif, soit une fonction générale similaire à ::GetPointer

Je ne vous comprends pas du tout, pourriez-vous expliquer en langage humain ce que vous essayez de faire ? Le code donné comporte des erreurs (operator== n'a ni argument, ni valeur de retour), il est difficile de comprendre quelque chose à partir de tout cela.

Laissez-moi vous dire tout de suite que le problème de la comparaison/assignation de pointeurs n'a jamais existé auparavant, GetPointer(a)==GetPointer(b) est suffisant pour cela. La tâche ne concerne donc que la comparaison/assignation des objets eux-mêmes, c'est-à-dire qu'elle est garantie d'effectuer ces opérations que ces objets soient représentés par des pointeurs ou des références

 
Alexey Navoykov:

Le code que vous avez donné comporte des erreurs (operator== n'a ni argument ni valeur de retour), il est difficile de comprendre quoi que ce soit à tout cela.

Corrigé. Il est suggéré d'appeler operator==(...) pour les pointeurs également, s'il est défini, alors GetPointer(a)==GetPointer(b) provoquera l'appel de a.operator==( b ), donc pour comparer l'égalité des pointeurs, il est suggéré d'utiliser IsEqualPointer.
 
A100:
GetPointer(a)==GetPointer(b) provoquera a.operator==( b )
Pourquoi ferait-il ça ?
 
Alexey Navoykov:

Au fait, pourquoi ne pas introduire les opérateurs * et & dans MQL pour permettre l'accès explicite à un objet dans le premier cas, et la prise d'un pointeur d'objet dans le second (au lieu de l'encombrant GetPointer). L'astérisque est indispensable, et il ne peut être remplacé par rien dans le langage.Sans cela, il est impossible de contrôler des situations comme celle décrite par A100 ci-dessus, lorsqu'au lieu des objets eux-mêmes, des actions de pointeur sont effectuées. Personnellement, c'est un problème constant, je dois être constamment sur le qui-vive ou spécifier A.operator=(B), A.operator!=(B) partout, c'est-à-dire que la brièveté est perdue, et la surcharge des opérateurs devient en fait sans signification.

J'ai déjà soulevé ce problème une fois, mais le sujet est resté bloqué. Finissons-en enfin avec ce problème.

Merci pour le message, si vous voulez dire l'utilisation suivante :
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

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

Je suis d'accord avec cela, je vais certainement soulever la question et nous en discuterons.
 
Alexey Navoykov:
Pourquoi ça ?
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<
}
Si vous assimilez l'opérateur== à l'opérateur<, le résultat est le même
 
A100:
...
Si vous assimilez l'opérateur== à l'opérateur<, le résultat sera également le même.

Vous n'avez même pas vérifié ce que vous suggérez ! Tout comme dans le cas précédent, lorsqu'il y avait des erreurs évidentes dans le code, c'est-à-dire que vous n'avez même pas essayé de le compiler. Vous avez esquissé quelque chose sur une manivelle, quelques pensées de votre part, comme "mangez-le pendant que je suis gentil, sans pitié"... C'est vrai ? Ne faisons pas ce genre de bêtises.

J'ai moi-même constamment comparé les pointeurs et les opérateurs de surcharge, et il ne s'est jamais produit ce dont vous rêvez maintenant. Et maintenant, après avoir vérifié votre code, aucun miracle ne s'est produit, l'opérateur== n'est pas exécuté comme il devrait l'être.

 
Alexey Navoykov:

Maintenant, après avoir vérifié votre code, aucun miracle ne s'est produit, l'opérateur== ne démarre pas comme il le devrait.

L'essence de la proposition est précisément qu'elle doit fonctionner. Je parle de modifications du système existant.
 
A100:
L'intérêt de la phrase est précisément qu'elle doit être déclenchée.

C'est pour quoi faire ? C'est à l'envers.

Il est plus logique de procéder dans l'autre sens : < et > devraient provoquer la comparaison de pointeurs.

 
Alexey Navoykov:

Personnellement, c'est un problème constant pour moi, je dois être toujours à l'affût, ou spécifier A.operator=(B), A.operator!=(B) partout, c'est-à-dire que cela perd en concision et que la surcharge d'opérateurs n'a en fait aucun sens.

J'ai déjà soulevé ce problème une fois, mais le sujet est resté bloqué. Finissons-en enfin avec ce problème.

de ne pas spécifier explicitement A.operator!=(B)