Errores, fallos, preguntas - página 759

 
WWer:

Entonces, ¿debería ser así para que la función del constructor de copia sea realizada por el operador de asignación sobrecargado?

No sé qué es lo correcto, pero el operador de asignación en VS no hace la función del constructor de copia.
class tt
{
public:
        int f;
        tt(tt& u) {f = 1;}                // Копирующий конструктор, при выполнении его f == 1
        tt(){}
        void operator=(tt &u){f = 100;}   // При выполнении f == 100
};

tt fn()
{
        tt q3;
        return(q3);
}

int _tmain(int argc, _TCHAR* argv[])
{
        tt q2 = fn();
        std::cout<<q2.f;
        char input[54];
        std::cin>>input;
        return 0;
}

La pantalla muestra 1, es decir, se ejecuta el constructor de copia.

Creo que es esto: "2) Descomentar un tope con un operador de asignación sobrecargado" no debe servir.

 
220Volt:
No sé qué es lo correcto, pero el operador de asignación en VS no hace el papel de constructor de copias.

La pantalla muestra 1, es decir, el constructor de la copia se está ejecutando.

Creo que esto: "2) Descomentar un tope con un operador de asignación sobrecargado" no debería ayudar.

Aquí se ejecuta el constructor de copia

tt q2 = fn();
no dentro de la función fn().
 
mql5:

El constructor de copias se realiza aquí

y no dentro de la función fn().

En esta variante:

class tt
{
public:
        int f;
        tt(tt& u) {f = 1;}
        tt(){f = 198;}
        void operator=(tt &u){f = 100; std::cout<<"Выполнился присваивающий конструктор";}
};

tt fn()
{
        tt q3;
        return(q3);
}

int _tmain(int argc, _TCHAR* argv[])
{
        tt q2 = fn();
        std::cout<<q2.f;
        char input[54];
        std::cin>>input;
        return 0;
}
La línea "Se ejecuta el constructor de la asignación" no sale.
 

Y así se deduce:

tt q2;
q2 = fn();
WWer, si por analogía con el VS, hay que ver la situación concreta, pon un ejemplo concreto de copia/asignación. Lo que se va a ejecutar se decide en el momento.
 
WWer:

¿Por qué se debe inicializar? Es una instancia de una clase que tiene un constructor precisamente para eso.

Sí, de verdad, lo siento.


¿Y cómo escribir un constructor de copia correcto para este propósito?

La función getCopy() que intenta devolver el objeto está correctamente escrita. Después de anular la asignación ya devuelve un puntero, el error se evapora.

--

La confusión aquí puede estar causada por el hecho de que el lenguaje tiene un cierto "contragolpe sintáctico", asociado a la misma representación sintáctica de acceso a los campos de un objeto estático y uno dinámico (con un punto en lugar de una flecha, lo que, por cierto, es realmente conveniente). Esto es muy común, y puede desdibujar un poco la distinción entre objetos y punteros de objetos, lo que a su vez puede llevar a algunas ilusiones, como que algo puede ser asignado a una variable de objeto estática (o automática). Lejos de eso, una variable de objeto a la izquierda de una asignación es siempre un puntero, si el constructor de copia no está definido.

 
Desgraciadamente, aquí es donde MQL5 difiere de C++.

C++ construye el objeto q2 dentro de la función fn() en retorno, por eso funciona el constructor de copia.

En MQL5, el objeto se construye desde el exterior, por lo que hay diferencias. Eliminémoslos.


Para los que estén interesados: se llama Optimización del valor de retorno

 

Colegas, ¡buenos días!

¿Pueden decirme cómo puedo obtener los valores de los precios de los diferentes instrumentos financierosde forma sincronizada? Me refiero, por ejemplo, a los precios de cierre de las barras en un momento determinado del pasado en diferentes instrumentos. El uso de la función CopyClose y la obtención de los valores por índice de barras no es absolutamente correcto, porque puede haber algunas barras perdidas para diferentes instrumentos. Que yo recuerde, mql4 tiene la función BarShift por tiempo, ¿hay un análogo en mql5?

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyClose - Документация по MQL5
 

Si conoce la hora, puede utilizar esta función.

Dirección por fecha de inicio y número de elementos necesarios

intCopyClose(
stringsymbol_name,// nombre del símbolo
ENUM_TIMEFRAMEStimeframe,// período
datetimehora_de_inicio,// a partir de la cualfecha
intcount,// cuántos copiamos
doubleclose_array[]// matriz para copiar los precios de cierre
);

 
Karlson:

Si conoce la hora, puede utilizar esta función.

Consulte la fecha de inicio y el número de elementos necesarios

intCopiarCerrar(
stringsymbol_name,// nombre del símbolo
ENUM_TIMEFRAMEStimeframe,// período
datetimestart_time,//desde qué fecha
intcuenta,// cuántos copiamos
doubleclose_array[]// matriz para copiar los precios de cierre
);

Supongamos que quiero encontrar la relación entre close[i] EUR/USD y close[i] GBP/USD, pero si utilizo el índice i, las barras pueden ser diferentes en el tiempo de todos modos, porque hay algunas barras perdidas.

En otras palabras, ¿tengo que usar CopyClose(Symbol, 0, date_of_current_bar, 1, array) en ciclos para cada barra?

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyClose - Документация по MQL5
 

Me parece que los bares de TF más antiguos rara vez "desaparecen".

Otra variante es obtener el tiempo de esta barra simultáneamente a través de CopyTime().

Y la tercera opción (probablemente la más fácil) es utilizar los CopyRates en la estructura a la vez.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - Документация по MQL5