Erreurs, bugs, questions - page 759

 
WWer:

Il faudrait donc que le rôle du constructeur de copie soit joué par un opérateur d'affectation surchargé ?

Je ne sais pas ce qui est correct, mais l'opérateur d'affectation dans VS ne joue pas le rôle du constructeur de copie.
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;
}

L'écran affiche 1, c'est-à-dire que le constructeur de copie est exécuté.

Je pense que c'est ça : "2) décommenter un arrêt avec un opérateur d'affectation surchargé" n'est pas censé aider.

 
220Volt:
Je ne sais pas ce qui est correct, mais l'opérateur d'affectation dans VS ne joue pas le rôle du constructeur de copie.

1 est affiché, c'est-à-dire que le constructeur de copie est exécuté.

Je pense ceci : "2) décommenter un arrêt avec un opérateur d'affectation surchargé" ne devrait pas aider.

Le constructeur de copie est exécuté ici

tt q2 = fn();
pas à l'intérieur de la fonction fn().
 
mql5:

Le constructeur de copie est effectué ici

et non à l'intérieur de la fonction fn().

Dans cette 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 ligne "Assignment constructor is executed" n'est pas éditée.
 

Et c'est comme ça qu'on le déduit :

tt q2;
q2 = fn();
WWer, si par analogie avec VS, vous devez examiner la situation spécifique, donnez un exemple précis de copie/affectation. Ce qui sera exécuté est décidé sur place.
 
WWer:

Pourquoi doit-il être initialisé ? Il s'agit d'une instance d'une classe qui possède un constructeur dans ce but précis.

Oui, vraiment, désolé.


Et comment écrire correctement un constructeur de copie dans ce but ?

Votre fonction getCopy() qui essaie de retourner l'objet est tout à fait correctement écrite. Après avoir surchargé l'affectation qui renvoie déjà un pointeur, l'erreur s'évapore.

--

La confusion ici peut être causée par le fait que le langage a un certain "contrecoup syntaxique", associé à la même représentation syntaxique de l'accès aux champs d'un objet statique et d'un objet dynamique (avec un point au lieu d'une flèche, ce qui, soit dit en passant, est vraiment pratique). C'est très courant, et cela peut quelque peu estomper la distinction entre les objets et les pointeurs d'objets, ce qui peut à son tour conduire à certaines illusions, comme le fait que quelque chose peut être assigné à une variable d'objet statique (ou automatique). Loin de là, une variable objet à gauche d'une affectation est toujours un pointeur, si le constructeur de copie n'est pas défini.

 
Malheureusement, c'est là que MQL5 diffère de C++.

C++ construit l'objet q2 dans la fonction fn() en retour, c'est pourquoi le constructeur de copie fonctionne.

Dans MQL5, l'objet est construit de l'extérieur, il y a donc des différences. Eliminons-les.


Pour ceux qui sont intéressés : cela s'appelle l'optimisation de la valeur de retour.

 

Chers collègues, bonjour !

Pouvez-vous me dire comment je peux obtenir des valeurs de prix pour différents instruments financiersde manière synchronisée? Je veux dire, par exemple, les prix de clôture des barres à un certain moment dans le passé sur différents instruments. L'utilisation de la fonction CopyClose et l'obtention des valeurs par l'index des barres ne sont pas absolument correctes, car il peut y avoir quelques barres manquées pour différents instruments. Autant que je me souvienne, mql4 a la fonction BarShift par temps, y a-t-il un analogue sur mql5 ?

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

Si vous connaissez l'heure, vous pouvez utiliser cette fonction.

Adressage par date de début et nombre d'articles requis

intCopyClose(
stringsymbol_name,// nom du symbole
ENUM_TIMEFRAMEStimeframe,// période
datetimestart_time,// à partir duqueldate
intcount,// combien nous en copions
doubleclose_array[]// tableau pour copier les prix de clôture
);

 
Karlson:

Si vous connaissez l'heure, vous pouvez utiliser cette fonction.

Se référer à la date de début et au nombre d'articles requis

intCopyClose(
stringsymbol_name,// nom du symbole
ENUM_TIMEFRAMEStimeframe,// période
datetimestart_time,//depuis quelle date
intcount,// combien on en copie
doubleclose_array[]// tableau pour la copie des prix de clôture
) ;

Supposons que je veuille trouver le ratio de close[i] EUR/USD et close[i] GBP/USD, mais si j'utilise l'indice i, les barres peuvent de toute façon être différentes dans le temps, car il y a quelques barres manquées.

En d'autres termes, je dois utiliser CopyClose(Symbol, 0, date_de_la_barre_actuelle, 1, tableau) en cycles pour chaque barre ?

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

Il me semble que les barres de l'ancienne TF ne "disparaissent" que rarement.

Une autre variante consiste à obtenir l'heure de cette barre simultanément par CopyTime().

Et troisième option (probablement la plus simple) : utiliser CopyRates dans la structure en une seule fois.

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