Erreurs, bugs, questions - page 1135

 
Tron_KZ:
Voici un exemple tiré de la documentation de mql5. Voici un lien vers cette page. Et ci-dessous ce code.

Il semble qu'avec la mise à jour, non seulement leplacement obligatoire des membres de données de classe statiques a été introduit,

mais a également supprimé l'appel implicite au constructeur paramétrique.

Utilisez un appel explicite :

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
Sur quelle base la conversion des objets non constants en objets constants a-t-elle été abolie ? J'ai des centaines de méthodes internes qui cessent de fonctionner, simplement parce qu'elles ne sont pas constantes, et les visiels ne peuvent pas être utilisés dans des objets constants maintenant. Des centaines de mes fonctions sont liées à la constante CObject.Compare(...) et maintenant elles ne fonctionnent pas toutes !
 
La POO de mql5 semble avoir subi des changements spécifiques. En cachette...
 
C-4:
Pour quels motifs ont-ils annulé la conversion d'objets non constants en objets constants ?

Tout se compile normalement - pas d'erreurs ni d'avertissements.

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
S'il y a des erreurs, c'est seulement dans la structure, mais ils finiront par les trouver.
 
A100:

Tout se compile sans erreur ni avertissement

Si "A" contient une méthode non constante, mais qu'il est lui-même transmis à une fonction en tant qu'objet constant, alors cette méthode non constante ne peut pas être appelée dans la fonction maintenant.

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

void f(const A* a)
{
   a.PrintMyName(); //Хренушки. Теперь PrintMyName должен быть константым.
} 

void OnStart()
{
        A a; //не const A
        f(GetPointer(a));
}

Et maintenant question d'attention : effaçons le CObject.Compare() :

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
O.k. c'est une méthode constante qui prend un noeud d'objet constant. C'est son droit de déclarer le nœud comme constant. Mais sur quelle base Compare ne devrait-il plus travailler qu'avec des méthodes constantes de nœuds ? Node n'est pas obligé d'avoir des méthodes constantes pour le bien de Compare. Mais il s'avère que juste au motif que l'objet est complexe et n'a pas de méthodes constantes, maintenant il ne peut pas utiliser la bibliothèque standard avec tout ce que cela implique ! !!

 
mql5:
Il est désormais obligatoire de placer des membres statiques.

Et comment êtes-vous censé placer des objets statiques complexes si les constructeurs statiques ne sont pas autorisés ?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a; //В этом месте как прикажете объект инициализировать? 
};
 
C-4:

Si "A" contient une méthode non constante, mais qu'il est lui-même transmis à la fonction en tant qu'objet constant, cette méthode non constante ne peut plus être appelée dans la fonction.

C'est vrai, c'est comme ça que ça doit être, sinon à quoi bon spécifier

void f(const A* a)

au lieu de

void f(A* a)
 
C-4:

Si "A" contient une méthode non constante, mais qu'il est lui-même transmis à la fonction en tant qu'objet constant, cette méthode non constante ne peut plus être appelée dans la fonction.

Hum, c'est en fait la façon élégante de le faire.
 
C-4:

Et comment êtes-vous censé placer des objets statiques complexes si les constructeurs statiques ne sont pas autorisés ?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a;
};

A* B::a = new A;
 
A100:

C'est vrai, ça doit l'être, sinon à quoi bon spécifier

au lieu de

Pour travailler avec des collections standard, une classe ne doit pas avoir de méthodes const, car toutes les classes ne peuvent pas le faire, mais toutes les classes peuvent utiliser des collections standard. La contrainte est imposée par une fonction externe et c'est son droit, mais elle n'est pas autorisée à imposer des contraintes sur l'architecture des objets tiers.