Errori, bug, domande - pagina 759

 
WWer:

Quindi dovrebbe essere così che il ruolo di costruttore di copia è eseguito dall'operatore di assegnazione sovraccaricato?

Non so cosa sia corretto, ma l'operatore di assegnazione in VS non svolge il ruolo del costruttore di 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;
}

Lo schermo visualizza 1, cioè il costruttore di copia viene eseguito.

Credo che sia questo: "2) decommentare uno stop con un operatore di assegnazione sovraccaricato" non dovrebbe aiutare.

 
220Volt:
Non so cosa sia corretto, ma l'operatore di assegnazione in VS non svolge il ruolo del costruttore di copia.

Lo schermo visualizza 1, cioè il costruttore di copie è in esecuzione.

Penso questo: "2) decommentare uno stop con un operatore di assegnazione sovraccarico" non dovrebbe aiutare.

Il costruttore di copie viene eseguito qui

tt q2 = fn();
non all'interno della funzione fn().
 
mql5:

Il costruttore di copie viene eseguito qui

e non dentro la funzione fn().

In questa 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 linea "Il costruttore di assegnazioni viene eseguito" non viene emessa.
 

Ed è così che si deduce:

tt q2;
q2 = fn();
WWer, se per analogia con VS, hai bisogno di guardare la situazione specifica, dai un esempio specifico di copia/assegnazione. Ciò che sarà eseguito viene deciso sul posto.
 
WWer:

Perché dovrebbe essere inizializzato? È un'istanza di una classe che ha un costruttore proprio per questo scopo.

Sì, davvero, mi dispiace.


E come scrivere correttamente un costruttore di copia per questo scopo?

La vostra funzione getCopy() che cerca di restituire l'oggetto è scritta abbastanza correttamente. Dopo aver sovrascritto l'assegnazione che restituisce già un puntatore, l'errore svanisce.

--

La confusione qui può essere causata dal fatto che il linguaggio ha qualche "scappatoia sintattica", associata alla stessa rappresentazione sintattica dell'accesso ai campi di un oggetto statico e di uno dinamico (attraverso un punto, non una freccia. Che, tra l'altro, è davvero conveniente). Questo è molto comune, e può in qualche modo smussare la distinzione tra oggetti e puntatori a oggetti, che a sua volta può portare ad alcune illusioni, come quella che qualcosa possa essere assegnato a una variabile oggetto statica (o automatica). Lungi da ciò, una variabile oggetto a sinistra di un'assegnazione è sempre un puntatore, se il costruttore di copie non è definito.

 
Sfortunatamente, è qui che MQL5 differisce dal C++.

C++ costruisce l'oggetto q2 all'interno della funzione fn() in ritorno, ecco perché il costruttore di copia funziona.

In MQL5, l'oggetto è costruito dall'esterno, quindi ci sono differenze. Eliminiamoli.


Per coloro che sono interessati: si chiama ottimizzazione del valore di ritorno

 

Colleghi, buona giornata!

Potete dirmi come posso ottenere valori di prezzo per diversi strumenti finanziariin sincronia? Intendo, per esempio, i prezzi di chiusura delle barre in un certo momento del passato su diversi strumenti. L'uso della funzione CopyClose e l'ottenimento dei valori per indice di barre non è assolutamente corretto, perché ci possono essere alcune barre mancanti per diversi strumenti. Per quanto ricordo, mql4 ha la funzione BarShift per tempo, c'è un analogo su mql5?

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

Se conoscete l'ora, potete usare questa funzione.

Indirizzamento per data di inizio e numero di articoli richiesti

intCopyClose(
stringasymbol_name,// nome del simbolo
ENUM_TIMEFRAMEStimeframe,// periodo
datetimestart_time,// da cuidata
intcount,// quanti ne copiamo
doubleclose_array[]// array per copiare i prezzi di chiusura
);

 
Karlson:

Se conoscete l'ora, potete usare questa funzione.

Fare riferimento alla data di inizio e al numero di articoli richiesti

intCopyClose(
stringasymbol_name,// nome del simbolo
ENUM_TIMEFRAMEStimeframe,// periodo
datetimestart_time,/ da quale data
intcount,// quanti ne copiamo
doubleclose_array[]// array per copiare i prezzi di chiusura
);

Supponiamo che io voglia trovare il rapporto tra close[i] EUR/USD e close[i] GBP/USD, ma se uso l'indice i, le barre possono essere comunque diverse nel tempo, perché ci sono alcune barre mancanti.

In altre parole, devo usare CopyClose(Symbol, 0, date_of_current_bar, 1, array) in cicli per ogni barra ?

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

Mi sembra che i bar dei vecchi TF raramente "spariscano".

Un'altra variante è quella di ottenere il tempo di questa barra simultaneamente attraverso CopyTime().

E la terza opzione (probabilmente la più semplice) usare CopyRates nella struttura in una volta sola.

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