Hatalar, hatalar, sorular - sayfa 759

 
WWer :

Yani, kopya oluşturucunun rolü aşırı yüklenmiş atama operatörü tarafından gerçekleştirilecek şekilde mi olmalı?

Neyin doğru olduğunu bilmiyorum, ancak VS'de kopya oluşturucunun rolü atama operatörü tarafından gerçekleştirilmez.
 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 ;
}

1 ekranda görüntülenir, yani. kopya oluşturucu yürütülür.

Bence bu: "2) aşırı yüklenmiş bir atama operatörüyle satırı yorumlamak " fikrine göre yardımcı olmamalıdır.

 
220Volt :
Neyin doğru olduğunu bilmiyorum, ancak VS'de kopya oluşturucunun rolü atama operatörü tarafından gerçekleştirilmez.

1 ekranda görüntülenir, yani. kopya oluşturucu yürütülür.

Bence bu: "2) aşırı yüklenmiş bir atama operatörüyle satırı yorumlamak " fikrine göre yardımcı olmamalıdır.

Kopya oluşturucu burada yürütülür

tt q2 = fn();
fn() işlevinin içinde değil.
 
mql5 :

Kopya oluşturucu burada yürütülür

fn() işlevinin içinde değil.

Bu varyantta:

 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 ;
}
"Atama oluşturucu yürütüldü" satırı görüntülenmiyor.
 

Ve işte böyle çıktı:

tt q2;
q2 = fn();
WWer , VS ile benzetme yaparak, belirli bir duruma bakmanız, belirli bir kopyalama / atama örneği vermeniz gerekir. Ne yapılacağına yerinde karar verilir.
 
WWer :

Neden başlatalım? Bu, yalnızca bunun için bir kurucuya sahip bir sınıfın örneğidir.

Evet, gerçekten, üzgünüm.


Ve o zaman bu amaç için bir kopya kurucu yazmak nasıl doğru olur?

Sizinki oldukça doğru yazılmış. Bir nesneyi döndürmeye çalışırken getCopy() işlevinde hata. Atamayı yeniden tanımladıktan sonra, zaten bir işaretçi döndürür, hata buharlaşır.

--

Buradaki yanlış anlama, dilin, statik ve dinamik bir nesnenin alanlarına erişmek için sözdiziminin aynı temsiliyle ilişkili bazı "sözdizimsel boşluklara" sahip olması gerçeğinden kaynaklanabilir (bir okla değil, bir nokta aracılığıyla). yol, gerçekten uygun). Bu bir alışkanlık haline gelir ve nesneler ile nesnelere yönelik işaretçiler arasındaki ayrımın netliğini bir şekilde köreltebilir. Bu da, özellikle bir şeyin statik (veya otomatik) bir nesne değişkenine atanabileceğine dair bir takım yanılsamalar yaratabilir. Hiç de değil, atamanın solundaki nesne değişkeni, bir kopya oluşturucu tanımlanmadıkça her zaman bir işaretçidir.

 
Ne yazık ki, bu noktada MQL5 ve C++ arasında bir fark var.

C++, karşılığında fn() işlevinin içinde q2 nesnesini oluşturur, bu nedenle kopya oluşturucuyu işler.

MQL5'te bir nesne dışarıdan oluşturulur, dolayısıyla farklılıklar vardır. Elemek.


İlgilenenler için: buna Dönüş değeri optimizasyonu denir

 

Meslektaşlarım, iyi günler!

Söyle bana, farklı yüzgeçler için fiyat değerlerini nasıl alabilirim. enstrümanlar senkronize mi? Yani örneğin barların geçmişte belli bir zaman diliminde farklı enstrümanlarda kapanış fiyatları. CopyClose işlevini kullanmak ve değerleri bar indeksine göre almak, farklı enstrümanlarda eksik barlar olabileceğinden tamamen doğru değildir. Hatırladığım kadarıyla mql4'te BarShift time fonksiyonu vardı, mql5'te analog var mı?

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

Saati biliyorsanız, bu işlevi kullanabilirsiniz.

Başlangıç Tarihine ve Gerekli Öğe Sayısına Göre Referans Verme

int KopyalaKapat (
    sicim             sembol_adı , // sembol adı
    ENUM_TIMEFRAMES    zaman çerçevesi , // dönem
    tarih saat           start_time , // hangi tarihten itibaren
    int                say , // ne kadar kopyalanacak
    çift             yakın_dizi[]        // kapanış fiyatlarını kopyalamak için dizi
);

 
Karlson :

Saati biliyorsanız, bu işlevi kullanabilirsiniz.

Başlangıç Tarihine ve Gerekli Öğe Sayısına Göre Referans Verme

int KopyalaKapat (
    sicim             sembol_adı , // sembol adı
    ENUM_TIMEFRAMES    zaman çerçevesi , // dönem
    tarih saat           start_time , // hangi tarihten itibaren
    int                say , // ne kadar kopyalanacak
    çift             yakın_dizi[]        // kapanış fiyatlarını kopyalamak için dizi
);

Diyelim ki [i] EUR/USD kapanış ve [i] GBP/USD kapanış oranını bulmak istiyorum, ancak i endeksine atıfta bulunursam, çubuklar zaman içinde hala farklı olabilir, çünkü kaçırılan çubuklar vardır.

Yani, her çubuk için döngüde CopyClose (Symbol, 0, date_of_current_bar, 1 , array) kullanmalı mıyım?

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

Bana öyle geliyor ki, eski zaman dilimlerinin çubukları nadiren "kayboluyor".Ama evet.. Belirtilen tarihten itibaren bir çubuk alın.Daha doğrusu, ondan yakın.

Diğer bir seçenek ise CopyTime() aracılığıyla bu çubuğun zamanını aynı anda almak ve senkronize olacak şekilde karşılaştırmaktır.

Ve üçüncü seçenek (muhtemelen kolaylaştırıcı) yapıda CopyRates'i hemen kullanmaktır .

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