Erreurs, bugs, questions - page 2839

 
A100:
Erreur d'exécution :

Résultat : 1-2-2-0-0-0

Résultat attendu : 1-2-0-0

comme en C++. De plus, la syntaxe devait être uniforme : un cast est un cast, pas un appel à un constructeur.

Tout semble être correct. C'est juste que le constructeur move est probablement appelé ici, qui dans MQL est remplacé par copy.
Et la conversion est comme (A)a1.
 
Alexey Navoykov:
Tout semble être correct, je pense. Le constructeur move y est probablement appelé, qui dans MQL est remplacé par copy.
Une conversion est comme (A)a1

(A)a1 ou A(a1) n'est pas un cast, c'est une déclaration de type comme dans la docs. Bien que maintenant, il y a quelque chose qui cloche avec les parenthèses. Un format unique est nécessaire pour la langue.

 
Valeriy Yastremskiy:

(A)a1 ou A(a1)conversion de type A a1 n'est pas une conversion, mais une déclaration de type comme dans la documentation. Bien que maintenant, il y a quelque chose qui cloche avec les parenthèses. Un format commun est nécessaire pour la langue.

La différence est que (A)a1 en plus signifie la conversion de la copie de l'objet. Et dans MQL, c'est la conversion de référence, ce qui peut poser un problème de compatibilité.
Il y a longtemps, je leur ai demandé de faire une conversion comme dans les plus : (A&)a1, mais maintenant ils ne vont probablement rien changer.
 
Alexey Navoykov:
La différence ici est que dans les plus (A)a1 signifie apporter une copie d'un objet. Et dans MQL, il s'agit de la conversion de référence. Pour cette raison, on peut rencontrer des problèmes de compatibilité.
J'ai longtemps demandé qu'ils fassent une conversion sonore comme chez les pros : (A&)a1, mais il est peu probable qu'ils changent quoi que ce soit maintenant.

Pas si pas python) quelque chose entre les deux. Oups, je ne savais pas, j'ai pensé à la conversion du type d' objet. Économie).

 
Alexey Navoykov:
Tout semble être correct. C'est juste que le constructeur move y est probablement appelé, ce qui dans MQL est remplacé par la copie.
Et le fantôme est comme (A)a1

Je doute que ce soit juste, parce que, disons :

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { ((A)this).f(); }
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}

Le résultat en MQL : 3

et en C++ : 1.

Dans tous les cas, demandez-leur de vérifier

 
A100:

Je doute que ce soit correct, car disons que :

Le résultat en MQL : 3

et en C++ : 1.

Dans tous les cas, demandez-leur de vérifier

C'est donc exactement la situation que j'ai décrite ci-dessus.
 
A100:

Je doute que ce soit correct, car disons que :

Le résultat en MQL : 3

et en C++ : 1.

Dans tous les cas, laissez-les vérifier.

Je ne serais pas aussi catégorique lorsque j'interprète du code MQL en C++.
Code for C++ (en ligne : https://onlinegdb.com/Hy1FIj9Qv):

class A {
public:
        virtual void f() { printf( "1" ); }
};
class B : public A {
public:
        virtual void g_ptr() { ((A*)(this))->f(); }   //3
        virtual void g_ref() { ((A&)(*this)).f(); }   //3
        virtual void g_cast() { ((A)(*this)).f(); }   //1
};
class C : public B {
public:
        virtual void f() { printf( "3" ); }
};
void OnStart()
{
        B *b = new C;
        b->g_ptr();
        b->g_ref();
        b->g_cast();
}

int main()
{
    OnStart();
    return 0;
}
 
Sergey Dzyublik:

Je ne serais pas aussi univoque en interprétant du code MQL en C++.
Le code est pour C++ (en ligne : https://onlinegdb.com/Hy1FIj9Qv):

Et comment proposez-vous d'écrire la troisième version de g_cast en MQL ?

 
A100:

Et comment proposez-vous d'écrire la 3ème version de g_cast dans MQL ?

Vous pouvez appeler explicitement la fonction à partir de la classe de base :

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { this.A::f(); }   //1
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}
 
Sergey Dzyublik:

Vous pouvez appeler explicitement une fonction à partir d'une classe de base :

Si et quand il est corrigé

template<typename T>
class A {
public:
        void f() {}
};
void OnStart()
{
        A<int> a;
        a.A<int>::f(); //Error: 'A' - undeclared identifier
}

il peut bien sûr aussi être appelé explicitement dans le cas général