Sí, C++ no cuenta muchas cosas, pero la cuestión es que la inicialización de los miembros estáticos probablemente no sea en el orden en que se inicializan, sino en el orden en que se declaran.
Lo hice demasiado fácil - no moví const - como puedes ver ahora todo está claro - una constante es inicializada por otra:
class A {
protected: //если заменить на public: то все работает
staticconstint s1;
staticconstint s2;
};
constint A::s1 = 0x1;
constint A::s2 = A::s1; //ошибка компиляции
El compilador indica como error que el miembro s1 está protegido. Si sustituimos protected por public, todo funciona como un reloj. Pero el hecho de estar protegido no tiene nada que ver con el orden de inicialización o de asignación, ni con la posibilidad de inicializar con un valor determinado
class A {
public:
A *operator<<( int x ) { Print( x ); return ( GetPointer( this )); }
A *operator<<( string s ) { Print( s ); return ( GetPointer( this )); }
};
int f( int& x ) { return ( x = 4 ); }
voidOnStart()
{
Print( "" );
A a;
int x = 3;
a << "(1)" << "(2)" << "(3)"; // Результат: (1) (2) (3) //нормально
a << x << f( x ) << x; // Результат: 4 4 3 ??? как же так?
}
En el último caso esperaba el resultado: 3 4 4 similar al anterior. No es normal que algunos tipos tengan una secuencia de llamada y otros una diferente.
Por cierto - la secuencia de operaciones de desplazamiento de izquierda a derecha también está definida en el propio MQL5, como confirma el ejemplo:
voidOnStart()
{
int a = 0x1;
int b = a << 2 << a; //b = 8int c = (a << 2) << a; //c = 8int d = a << (2 << a); //d = 16Print ( "b=", b, ", c=", c, ", d=", d );
}
El problema es queRefreshRealSymbols() se ejecuta normalmente si se llama en el constructorCSymbolsCollection.
Sin embargo, llamar a SymbolsCollection.RefreshRealSymbols(); en OnInit(); da como resultado:
invalid pointer access in 'SymbolsCollection.mqh' (55,22)
El error apunta a la línea CleanSymbolsArray(myRealSymbols); en el cuerpo del método CSymbolsCollection::RefreshRealSymbols(), la posición es justo después del paréntesis de apertura.
De hecho, tiene sentido, porque lo que está escrito parece un poco delirante.
C++ no lo considera así.
Sí, C++ no cuenta muchas cosas, pero la cuestión es que la inicialización de los miembros estáticos probablemente no sea en el orden en que se inicializan, sino en el orden en que se declaran.
Tendré que leer la norma sobre este tema.
https://www.mql5.com/ru/docs/basis/variables/initialization
Lo hice demasiado fácil - no moví const - como puedes ver ahora todo está claro - una constante es inicializada por otra:
El compilador indica como error que el miembro s1 está protegido. Si sustituimos protected por public, todo funciona como un reloj. Pero el hecho de estar protegido no tiene nada que ver con el orden de inicialización o de asignación, ni con la posibilidad de inicializar con un valor determinado
Tendré que leer la norma sobre esto.
Estoy de acuerdo, en general el compilador no es lo mismo que el compilador y hay que solucionarlo.
He aquí otro ejemplo
El compilador MQL aquí no quiere inicializar el array con el valor const int (enum - pasa)
De nuevo apelo al hecho de que C++ lo copia e inicializa correctamente.
Probablemente un error en la secuencia de llamada
En C++, el orden de evaluación de los operandos de una expresión es UB. ¿Por qué te basas en un orden específico aquí?
se emitió como "palabra Hola" ?
Esto es lo que ocurre en este caso para un operador sobrecargado para el tipo int, mientras que para el tipo string todo sale normalmente.
Además, no tiene nada que ver con C++. Suponga que escribe en su código
Y estas funciones se ejecutan en orden inverso o en absoluto para diferentes tipos de argumentos - en cualquier orden¡Saludos!
Ayúdenme a arreglar el acceso al puntero inválido.
En OnInit() tenemos:
SymbolsCollection = new CSymbolsCollection(); SymbolsCollection.RefreshRealSymbols();El métodoCSymbolsCollection::RefreshRealSymbols() tiene una llamadaCleanSymbolsArray(myRealSymbols);
Estos métodos y variables se declaran en la clase como:
El problema es queRefreshRealSymbols() se ejecuta normalmente si se llama en el constructorCSymbolsCollection.
Sin embargo, llamar a SymbolsCollection.RefreshRealSymbols(); en OnInit(); da como resultado:
El error apunta a la línea CleanSymbolsArray(myRealSymbols); en el cuerpo del método CSymbolsCollection::RefreshRealSymbols(), la posición es justo después del paréntesis de apertura.
¿Alguna idea?
...
¿Alguna idea?