エラー、バグ、質問 - ページ 759

 
WWer:

では、コピーコンストラクタの役割をオーバーロードされた代入演算子が担うようにすればいいのですね。

何が正しいのか分かりませんが、VSの代入演算 子はコピーコンストラクタの役割を果たしません。
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が表示され、つまりコピー用コンストラクタが実行されています。

これだと思うんです。"2)オーバーロードされた代入演算子 でstopをアンコメントする "は、役に立たないはずです。

 
220Volt:
何が正しいのか分かりませんが、VSの代入演算 子はコピーコンストラクタの役割を果たしません。

画面には1が表示されています。つまり、コピーコンストラクタが実行されています。

私はこう思います。"2)オーバーロードされた代入演算子 でstopをアンコメントする "は、役に立たないはずです。

コピーコンストラクタはここで実行されます

tt q2 = fn();
fn()関数の内部ではありません。
 
mql5:

コピーコンストラクタはここで実行されます

であり、fn()関数の中ではない。

このバリアントでは

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;
}
Assignmentコンストラクタが実行されました」という行が出力されない。
 

という風に推理しています。

tt q2;
q2 = fn();
WWer、VSとの類推で、具体的な状況を見る必要があるのなら、コピー・割り当ての具体例を挙げてください。何が実行されるかは、その場で決まります。
 
WWer:

なぜ初期化する必要があるのですか?そのためのコンストラクタを持つクラスのインスタンスなのです。

ええ、本当に、すみません。


また、そのためのコピー用コンストラクタを正しく書くにはどうしたらよいでしょうか。

オブジェクトを返そうとする関数getCopy()は、非常に正しく書かれています。代入を上書きした後、それはすでにポインタを返し、エラーは蒸発する。

--

これは、静的なオブジェクトのフィールドと動的なオブジェクトのフィールドを同じ構文で表現する「構文の抜け道」があるためです(矢印ではなく点で表現します。 ちなみに、これは本当に便利です)。これは非常にありふれたことで、オブジェクトとオブジェクトポインタの区別をやや鈍らせ、その結果、静的(あるいは自動的)なオブジェクト変数に何かを代入できるといった錯覚に陥る可能性があります。それどころか、代入の左側にあるオブジェクト変数は常にポインタである。 コピーコンストラクタが定義されていない場合.

 
残念ながら、ここがMQL5とC++の異なる点です。

C++では、fn()関数の中でq2オブジェクトをリターンとして構築するため、コピーコンストラクタが機能します。

MQL5では、オブジェクトは外側から構築されるため、違いがあります。排除しよう。


興味のある方へ:戻り値の最適化という ことで

 

同僚たちよ、ごきげんよう。

異なる金融商品の価格値を同期して 取得する方法を教えてください。例えば、異なる商品で過去のある時点のバーの終値ということです。CopyClose関数を 使用し、バーのインデックスで 値を取得することは、絶対的に正しいとは言えません。私の記憶では、mql4には時間によるBarShift機能がありますが、mql5にはアナログがあるのでしょうか?

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

時刻がわかっている場合は、この機能を利用することができます。

開始日と必要な個数によるアドレス指定

intCopyClose(
stringsymbol_name,// シンボル名
ENUM_TIMEFRAMEStimeframe,// 期間
datetimestart_time,// どの時点からdate
intcount,// 何個コピー するか
doubleclose_array[]// 終値をコピーするための配列
);

 
Karlson:

時刻がわかっている場合は、この機能を利用することができます。

開始時期、必要個数などを参考にする

intCopyClose()
stringsymbol_name,// シンボル名
ENUM_TIMEFRAMEStimeframe,// 期間
datetimestart_time,//何時からの ものか
intcount です// 何枚コピー するか
doubleclose_array[]// 終値のコピー用配列
);

例えば、close[i] EUR/USD と close[i] GBP/USD の比率を求めたいが、インデックス i を使用すると、ミスバーがあるため、いずれにしても時間的に異なるバーとなる可能性があります。

つまり、各バーでCopyClose(Symbol, 0, date_of_current_bar,1, array)を周期的に使用しなければならないのでしょうか?

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

古いTFのバーが "消える "ということは、ほとんどないように思います。

もう一つのバリエーションは、CopyTime()によってこのバーの時刻を同時に取得することである。

そして、3つ目のオプション(おそらく最も簡単)は、CopyRatesを 構造的に一度に使用 することです。

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