Erros, bugs, perguntas - página 759

 
WWer:

Então deve ser para que o papel de construtor de cópias seja desempenhado por um operador de tarefas sobrecarregado?

Não sei o que é correcto, mas o operador da tarefa na VS não desempenha o papel de construtor de cópias.
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;
}

O ecrã exibe 1, ou seja, o construtor de cópias é executado.

Penso que é isto: "2) descomentar uma paragem com um operador de afectação sobrecarregado" não é suposto ajudar.

 
220Volt:
Não sei o que é correcto, mas o operador da tarefa na VS não desempenha o papel de construtor de cópias.

O ecrã exibe 1, ou seja, o construtor de cópias está a funcionar.

Penso que isto: "2) descomentar uma paragem com um operador de afectação sobrecarregado" não deve ajudar.

O construtor de cópias é executado aqui

tt q2 = fn();
não dentro da função fn().
 
mql5:

O construtor de cópias é realizado aqui

e não dentro da função fn().

Nesta 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;
}
A linha "Assignment constructor is executed" não é produzida.
 

E é assim que é deduzido:

tt q2;
q2 = fn();
WWer, se por analogia com a VS, for necessário olhar para a situação específica, dê um exemplo específico de cópia/atribuição. O que vai ser executado é decidido no local.
 
WWer:

Porque deve ser rubricado? É um exemplo de uma classe que tem um construtor precisamente para esse fim.

Sim, realmente, lamento.


E como escrever um construtor de cópias correcto para este fim?

A sua função getCopy() que está a tentar devolver o objecto está escrita de forma bastante correcta. Depois de anular a atribuição já devolve um ponteiro, o erro evapora.

--

A confusão aqui pode ser causada pelo facto de a linguagem ter algum "backlash de sintaxe", associado à mesma representação sintáctica de acesso aos campos de um objecto estático e dinâmico (com um ponto em vez de uma seta, o que, a propósito, é realmente conveniente). Isto é muito comum, e pode, de certa forma, tornar menos nítida a distinção entre objectos e apontadores de objectos, o que por sua vez pode levar a algumas ilusões, tais como que algo pode ser atribuído a uma variável de objecto estática (ou automática). Longe disso, uma variável de objecto à esquerda de uma atribuição é sempre um ponteiro, se o construtor da cópia não estiver definido.

 
Infelizmente, é aqui que a MQL5 difere da C+++.

C++ constrói objecto q2 dentro da função fn() em troca, é por isso que o copy constructor funciona.

Na MQL5, o objecto é construído a partir do exterior, pelo que existem diferenças. Vamos eliminá-los.


Para aqueles que estão interessados: chama-se Return value optimization

 

Colegas, bom dia!

Pode dizer-me como posso obter valores de preços para diferentes instrumentos financeirosem sincronia? Refiro-me, por exemplo, aos preços de fecho de bares num determinado momento no passado, em diferentes instrumentos. A utilização da função CopyClose e a obtenção dos valores por índice de barras não é absolutamente correcta, porque pode haver algumas barras em falta para diferentes instrumentos. Tanto quanto me lembro, o mql4 tem a função BarShift por tempo, existe um análogo no mql5?

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

Se souber as horas, pode utilizar esta função.

Endereço por data de início e número de itens necessários

intCopyClose(
stringsímbolo_nome,// nome do símbolo
ENUM_TIMEFRAMESprazo,// período
data/horastart_time,// a partir do qualdata
intcount,// quantos copiamos
doubleclose_array[]// matriz para cópia dos preços de fecho
);

 
Karlson:

Se souber as horas, pode utilizar esta função.

Consultar a data de início e o número de artigos necessários

intCopyClose(
nome_símbolo de cadeia,// nome do símbolo
ENUM_TIMEFRAMESprazo,// período
data/horadeinício,//fora de que data
intcontagem,// quantos copiamos
doubleclose_array[]// matriz para cópia dos preços de fecho
);

Suponhamos que quero encontrar um rácio de fechar[i] EUR/USD e fechar[i] GBP/USD, mas se eu usar o índice i, as barras podem ser diferentes no tempo de qualquer maneira, porque há algumas barras em falta.

Por outras palavras, tenho de utilizar CopyClose(Symbol, 0, date_of_current_bar, 1, array) em ciclos para cada barra ?

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

Parece-me, que as barras de TF mais antigas raramente "desaparecem".

Outra variante é obter o tempo desta barra simultaneamente através de CopyTime().

E terceira opção (provavelmente a mais fácil) usar o CopyRates em estrutura de uma só vez.

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