MQL5 コンパイラはクラスとそのポインタを区別しない - ページ 2

 
SemenTalonov:

そんなコピーを期待していたのですが...。デフォルトのコピーコンストラクタはエラーにならない。

しかし、Dmitryは、新しいオブジェクトがメモリに割り当てられ、POINTER_AUTOMATIC 型のポインタが返されると言っています。

みんな自分なりにMQLのクセを理解している)

ああ、父なるクリスマスは存在しないことがわかった。

メモリ内のオブジェクトについては書いていない。

さて、かつて参照とポインタの区別をどうするかで論争があった。しかし、今はオブジェクトとポインタの区別がつかないようです。

 
Dmitry Fedoseev:

オブジェクトのコピーはどこから来るのか?ポインターのコピーはそうだが、同じオブジェクトを指している。

オブジェクトの配列があります。この配列の最初の要素で代入演算 子が呼ばれ、別途作成されたオブジェクトが渡される(ただし、演算子は未宣言)。その後の配列の最初の要素には何を入れるべきとお考えですか?私の意見としては、このオブジェクトは残すべきだと思います。

 
SemenTalonov:

私が言いたいのは、明示的にコピーコンストラクタを宣言しても、このテストでは何も変わらないということです。

どうしてそんな当たり前のことがわからないんだ...。

オブジェクト配列の項目に ポインタがあり、ポインタ配列の項目にオブジェクトがある...これは本当に正常なのでしょうか?

最初のケースでは、オブジェクトポインタが配列に移動し、2番目のケースでは、コピーコンストラクタが動作するはずですが、これらの操作がどのように同等になるのでしょうか?

コピーコンストラクタではなく、代入演算子ですが、これはちょっとしたことです。

オブジェクト配列の要素に入るべきオブジェクトです。

最初のケースでは、まさにオブジェクトの配列がありますが、どのような「ポインタ」なのでしょうか?

 
Georgiy Merts:

オブジェクトの配列があります。この配列の最初の要素で代入演算 子が呼ばれ、別途作成されたオブジェクトが渡される。この配列の最初の項目には、その後に何を入れるべきだと思いますか?私の意見としては、このオブジェクトは残すべきだと思います。

А...そこは全然ダメです)))自動ポインタの配列で、その中に動的に作成されるオブジェクトも詰め込まれている。すると、3つのオブジェクトがあり、そのうち2つは自動的に削除され、1つは漏れることになります。コンパイルされている場合。

 

こんな感じでいいんじゃないでしょうか。

A* m_A[2];

というように。

m_A[0] =GetPointer(a); 
 

そして最後にはこうなる。

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А...そこは全然ダメです)))自動ポインターの配列で、動的に作成されたオブジェクトも詰め込んでいる。

やっとこさ!))

ゲオルギー・メルツ

オブジェクトの配列要素に配置する必要があるのは、このオブジェクト です。

最初のケースでは - あなたは正確にオブジェクトの配列を持っている、どのような "ポインタ"?

それが私の言いたいことです。なぜ、WORKなのか!

m_A[1] = new A();
 
SemenTalonov:

やっとこさ!))

それが私の言いたいことだ!なぜ、WORKなのか!

Aがそう宣言された場合。

A* m_A[2]; 

それならいいんです。

そして、このような場合。

A m_A[2]; 

コンパイルできないはずです。コンパイラにバグがあるのか、コンパイラがみんなのために考える必要がないのか、どちらかです。

 
バグではないでしょうが、単純なオブジェクトの割り当てはうまくいくはずなので、newで作成したオブジェクトを削除するなどの配慮が必要です。
 
Dmitry Fedoseev:

そうすると、コンパイルできないはずです。コンパイラにバグがあるのか、コンパイラが皆のために考える必要がないのか、どちらかです。

ビンゴ!

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC 型のポインタをPOINTER_DYNAMIC 型のポインタに保存 すること、または その逆を許可して いるのです。