MQL5におけるOOPに関する質問 - ページ 74

 
Vladimir Simakov:

ここではポインターはありません)クラスのハンドルはあり、それを扱うのはポインターを扱うのと似ていますが、共通点はそこで終わっています。

私の探究心といたずら好きな手によって、二日二晩、忙しく過ごしました。

動的に生成されたオブジェクトをスコープ外に出す、つまり関数内、手探り状態でやってみましたが、最終的に解決しました。

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

を削除してくれるのですが、このままでは解りません...。そして、ポインタを渡すための類似の関数シグネチャは見つかっていません。


ここでまた質問です。

関数の結果として、オブジェクトへのポインタを参照で返すにはどうすればよいのでしょうか?

こんなことをやってみたい

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


CTest * を返すのは問題ないのですが、 ret_CTest() を書くと - エラーに なるのです。

 
Igor Makanu:

二日二晩、私の探究心といたずら好きな手は、私を忙しくさせた。

は、動的に生成されたオブジェクトを スコープ 外に削除することを試みました - 関数の中で、直感的な方法ですが、最終的に解決策にたどり着きました。

を削除してくれるのですが、このままでは解りません...。で、ポインタを渡すための類似の関数シグネチャはヘルプやsatに見つかりませんでした。

スコープ外とはどういう意味ですか? 関数に渡したのだから、そこで見えるはずです)

s.s.void deleteCTest(CTest* &t) その & がない場合も動作するはずですよね?

作成された範囲外のものを本当に削除するには、場合によっては自動的に削除する必要があります。しっ人聞きの悪いパターンファクトリー...速く読んで削除する...

 

Igor Makanu:


が、関数の結果としてオブジェクトへのポインタを参照で返すにはどうしたらいいのでしょうか?

であれば問題なくCTest *を返せますがret_CTest()を書くと - エラーに なります。
コーシャを希望する場合
CTest& Foo();
、まだですが、その場合は
CTest Foo();

もしクラスがコピーコンストラクタを持つなら、そのクラスはコピーコンストラクタを持つべきでしょう。

CTest(CTest &other)...
 
Aleksey Mavrin:

s.w.void deleteCTest(CTest* &t) これなし & も動作するはず、またはない?

新しい発見があるかもしれませんよ。)

何度も書きますが、MQLのポインターはとても勉強になるものです :)))


Vladimir Simakov:
コーシャが欲しいならまだしも、そうであれば。

ポインターを使用する場合は、クラスがコピーコンストラクタを持っている必要があります。

もう一度、考える必要がある

GetPointer() で何か仕掛けがあるのではと勘ぐってしまいますが...。が、事実ではないので......。MQLのポインタと暗黙のデリファレンスによる「空間と時間のジャンプ」は、私の頭から離れないのです。(((

 
Igor Makanu:

チェックしてみてください、勉強になりますよ ;)

何度も書きますが、MQLのポインターは非常に勉強になるものです )))

ポインターは削除されますが、_testに新しい値を代入することはできません。ちなみに、MQLは関係ありません)))

 
Igor Makanu:

チェックしてみてください、勉強になりますよ ;)

MQLのポインタはとても勉強になると何度も言っているのですが ))))


もう一度、考える必要がある

GetPointer()で何か仕掛けがあるのではと勘ぐってしまいますが...。が、事実ではないので......。MQLのポインタと暗黙のデリファレンスによる「空間と時間のジャンプ」は、私の頭から離れないのです。(((

ここは大丈夫です)))シャープをオフにするだけで、ここにはその気配すらない))))

 
Igor Makanu:

チェックしてみてください、勉強になりますよ ;)

MQLのポインタはとても勉強になると何度も言っているのですが ))))

確認しました。を使わなくてもよく削除される)

MT4とMT5で試して比較してみました )

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

よく調べました。を使わずに完璧に削除します)

MT4とMT5で試して比較してみました )

完全な例ではありませんが、私は今日、このようなことに遭遇しました。

がないと動作しません。

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

ウラジミール・シマコフ

私はここで大丈夫です)))シャープが欲しいわけではありませんが、&)) がなくても大丈夫だと思います。


シャープは求めていない、まだMQLを扱っている、わからないことは聞くかもしれない。

 
Igor Makanu:

は完全な例ではなく、今日出会った。

がないと、そうはいかない。

もちろん、そうなります。ポインターを値で渡しているため、ポインターのコピーが作成されます。それを通してオブジェクトを釘付けにし、関数内で作成されたポインタのために新しいオブジェクトを作成するのです。これはc++です、ようこそ)))。
 
Igor Makanu:

は完全な例ではなく、今日出会った。

がないと動きません。



私見では、参照とは関係なく、関数 実行後に値を保存したい場合は、関数の引数を ポインタで渡す必要があるというだけです。 参照でないファイルやインジケータ・ハンドルでも同じことが起こります。

漠然と覚えているだけでずいぶん時間が経っているが、C++では常にこれが標準だった。