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(constdatetime 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 |//+------------------------------------------------------------------+voidOnStart()
{
// 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_timePrint("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
}
¿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!
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 должен быть константым.
}
voidOnStart()
{
A a; //не const A
f(GetPointer(a));
}
Y ahora la pregunta de atención: vamos a limpiar el CObject.Compara():
virtualint 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!!!
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
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.
Por favor, publique todo su código.
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:
¿En qué se basan para anular la conversión de objetos no constantes en constantes?
Todo se compila con normalidad, sin errores ni advertencias
Si hay algún error, es sólo en la estructura, pero se llegará a ellos eventualmenteTodo 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.
Y ahora la pregunta de atención: vamos a limpiar el CObject.Compara():
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!!!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?
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
en lugar de
void f(A* a)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.
¿Y cómo se supone que se pueden colocar objetos estáticos complejos si no se permiten los constructores estáticos?