Errores, fallos, preguntas - página 1135

 
Fleder:
Por favor, publique todo su código.
Este es un ejemplo de la documentación de mql5. Aquí está el enlace a esa página. Y abajo está este código.
//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
class CFoo
  {
   datetime          m_call_time;     // время последнего обращения к объекту
public:
   //--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
                     CFoo(const datetime t=0){m_call_time=t;};
   //--- конструктор копирования 
                     CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};
 
   string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3=D'2009.09.09';      // неявный вызов параметрического конструктора
   CFoo foo40(foo1);             // явный вызов конструктора копирования
   CFoo foo41=foo1;              // неявный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
   CFoo *pfoo6=new CFoo();       // динамическое создание объекта и получение указателя на него
   CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
   CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
   CFoo *pfoo9=pfoo7;            // pfoo9 и pfoo7 указывают на один и тот же объект
   // CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
   Print("foo1.m_call_time=",foo1.ToString());
   Print("foo2.m_call_time=",foo2.ToString());
   Print("foo3.m_call_time=",foo3.ToString());
   Print("foo4.m_call_time=",foo4.ToString());
   Print("foo5.m_call_time=",foo5.ToString());
   Print("pfoo6.m_call_time=",pfoo6.ToString());
   Print("pfoo7.m_call_time=",pfoo7.ToString());
   Print("pfoo8.m_call_time=",pfoo8.ToString());
   Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объекты
   delete pfoo6;
   delete pfoo7;
   //delete pfoo8;  // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
   //delete pfoo9;  // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
  }
 
Tron_KZ:
Este es un ejemplo de la documentación de mql5. Aquí hay un enlace a esa página. Y abajo está este código.

Parece que con la actualización no sólo se introdujo lacolocación obligatoria de los miembros de datos de la clase estática,

pero también se ha eliminado la llamada implícita al constructor paramétrico.

Utilice una llamada explícita:

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
¿En qué se basa la abolición de la conversión de objetos no constantes en objetos constantes? Tengo cientos de métodos internos que dejan de funcionar, simplemente porque no son constantes, y los visieles no pueden ser usados en objetos constantes ahora. ¡Cientos de mis funciones están ligadas a la constante CObject.Compare(...) y ahora todas no funcionan!
 
La OOP en mql5 parece haber sufrido cambios específicos. A escondidas...
 
C-4:
¿En qué se basan para anular la conversión de objetos no constantes en constantes?

Todo se compila con normalidad, sin errores ni advertencias

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
Si hay algún error, es sólo en la estructura, pero se llegará a ellos eventualmente
 
A100:

Todo se compila sin errores ni advertencias

Si "A" contiene un método no constante, pero se pasa a una función como un objeto constante, entonces este método no constante no puede ser llamado en la función ahora.

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));
}

Y ahora la pregunta de atención: vamos a limpiar el CObject.Compara():

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
Es un método constante que toma un nodo de objeto constante. Está en su derecho de declarar el nodo como constante. Pero, ¿en qué se basa que ahora Compare sólo trabaje con métodos constantes de nodo? El nodo no está obligado a tener métodos constantes en aras de la comparación. ¡¡¡Pero resulta que sólo por el hecho de que el objeto es complejo y no tiene métodos constantes, ahora no puede utilizar la biblioteca estándar con todo lo que ello implica!!!

 
mql5:
Ahora es obligatorio colocar a los miembros estáticos.

¿Y cómo se supone que se pueden colocar objetos estáticos complejos si no se permiten los constructores estáticos?

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

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

Si "A" contiene un método no constante, pero se pasa a la función como un objeto constante, entonces este método no constante no puede ser llamado en la función.

Así es, así debe ser, de lo contrario, ¿qué sentido tiene especificar

void f(const A* a)

en lugar de

void f(A* a)
 
C-4:

Si "A" contiene un método no constante, pero se pasa a la función como un objeto constante, entonces este método no constante no puede ser llamado en la función.

De hecho, esta es la forma más elegante de hacerlo.
 
C-4:

¿Y cómo se supone que se pueden colocar objetos estáticos complejos si no se permiten los constructores estáticos?

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

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

A* B::a = new A;