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

 
Koldun Zloy:

コンストラクタがprivateでなければならないことが確実であれば、他に方法はありません。

スマートポインターは、単純なポインターを含むオブジェクトで、時間内に削除されることを保証するものです。

これは最もシンプルな選択肢です。

もっと複雑なスマートポインターもあります。

この本には、それらについてとてもよく書かれています。https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

ありがとうございました。さまざまなバリエーションを試したが、うまくいかない
template <typename T>
struct PTR
{
  T* Ptr;
  
  PTR( void )
  {
  }
  
  void operator =( T* &Value )
  {
    this.Ptr = Value;
  }
  
  ~PTR( void )
  {
    Print(__FUNCSIG__);
    delete this.Ptr;
  }
};

class CLASS
{
private:
  static CLASS* Tmp;
  static PTR<CLASS> Ptr;
  
  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }
};

static CLASS* CLASS::Tmp = new CLASS;
static PTR<CLASS> CLASS::Ptr;

void OnStart()
{
}

実のところ、うまくいかないのは論理的なことなのです。スマートポインタのデストラクタをクラスのデストラクタの 前に呼ばせることはできません。

 

コンパイラは、エラーとその発生場所を特定する代わりに、不特定の内部エラー #112 を出します。

class CLASS {};

template <typename T>
class CLASS2
{
public:
  static void Func() {}
};

void OnStart()
{
  CLASS2<CLASS>::Func;  
}
 
fxsaber:
ありがとうございました。いろいろなバリエーションを試しましたが、うまくいきません。

実は、うまくいかないのは論理的なことなんです。スマートポインタのデストラクタをクラスのデストラクタの 前に呼ばせることはできません。


次の方法を試してみてください。

template < typename T >
struct PTR
{
  T* Ptr;
  
  PTR( T* Value ) : Ptr( Value )
  {
  }
  
  ~PTR()
  {
    Print(__FUNCSIG__);
    delete Ptr;
  }
};

class CLASS
{
private:
  static PTR< CLASS > Ptr;
  
public:
  CLASS()
  {
      Print(__FUNCSIG__);
  }
  ~CLASS()
  {
      Print(__FUNCSIG__);
  }
};

static PTR< CLASS > CLASS::Ptr( new CLASS );

void OnStart()
{
}

何をやっているのかわかりませんが、MQLではコンストラクタをprivateにすることはシングルトンに対してのみ意味があるのです。

 
Koldun Zloy:

この方法で試してみてください。

詳細な例をありがとうございました残念ながら、閉じたコンストラクタは持っていません。もちろん、クローズドではそうもいきません。

必要なのは、誰からも見えないモノが存在することです。同時に、この種のオブジェクトは他に一切作ることができない。

 
このような場合、正しいのでしょうか
class CLASS
{
public:
  ~CLASS()
  {
    static bool FirstRun = true;
    
    if (FirstRun && CheckPointer(&this) == POINTER_DYNAMIC)
    {
      FirstRun = false;
      
      delete &this;
    }
    
    Print(__FUNCSIG__);
  }
};

void OnStart()
{
  CLASS* Class = new CLASS;
  delete Class;
}

を実行ログに出力するには?
void CLASS::~CLASS()
void CLASS::~CLASS()
delete invalid pointer


また、コンストラクタ/デストラクタの __FUNCSIG__ は void 型を与えるということでよろしいでしょうか?

 
Koldun Zloy:

この方法で試してみてください。

スマートポインタのデストラクタが、あなたのバージョンではクラスのデストラクタの 前に呼ばれるのに、私のバージョンでは(コンストラクタがパブリックであるにもかかわらず)その逆になっているのはなぜですか?
 
fxsaber:

誰からも見えないモノが必要なんです。同時に、このタイプの別のオブジェクトは、どのような方法でも作成することはできなかった。


というものです。"Singleton"です。

なぜ、自分に合わないと言うのか?

以下は、シングルトンの例である。

template < typename T >
struct PTR
{
   T* Ptr;
   
   PTR() : Ptr( NULL ){}
   PTR( T* ptr ) : Ptr( ptr )
   {
   }
   
   ~PTR()
   {
      Print(__FUNCSIG__);
      if( Ptr )delete Ptr;
   }
   
   void Set( T* ptr )
   {
      Ptr = ptr;
   }
};

class CLASS
{
   static PTR< CLASS > sPtr;
   
   CLASS()
   {
      Print(__FUNCSIG__);
   }
   
public:
   ~CLASS()
   {
      Print(__FUNCSIG__);
   }
   
   static CLASS* GetPtr()
   {
      if( !sPtr.Ptr ){
         sPtr.Set( new CLASS );
      }
      return sPtr.Ptr;
   }
};

static PTR< CLASS > CLASS::sPtr;

void OnStart()
{
   CLASS* ptr = CLASS::GetPtr();
}
 
fxsaber:
このような場合、正しいのでしょうか
を実行ログに出力するには?


また、コンストラクタ/デストラクタの __FUNCSIG__ は void 型を与えるということでよろしいでしょうか?


ネバー・ドゥ

delete &this;
 
fxsaber:
このような場合、実行ログに出力してよいのでしょうか。

また、コンストラクタ/デストラクタの __FUNCSIG__ は void 型を出力するということでよろしいでしょうか?


はい、そうです。
 
Koldun Zloy:


というものです。"Singleton"です。

なぜ似合わないと言うのですか?

以下は、シングルトンの例です。

ありがとうございました!うまくいきました

template < typename T >
struct PTR
{
   T* Ptr;
   
   PTR( void ) : Ptr(NULL)   
   {
   }
   
   PTR( T* ptr ) : Ptr(ptr)
   {
   }
   
   ~PTR( void )
   {
     if (this.Ptr)
       delete this.Ptr;
   }
   
   bool Set( T* ptr )
   {
      this.Ptr = ptr;
      
      return(true);
   }
   
   void operator =( bool )
   {
   }
};

class CLASS
{
private:   
   static PTR<CLASS> sPtr;
   
   CLASS()
   {
   }
   
public:
  static bool Set()
  {
    return(CLASS::sPtr.Ptr ? false : CLASS::sPtr.Set(new CLASS));
  }
};

static PTR<CLASS> CLASS::sPtr = CLASS::Set();

void OnStart()
{
}

しかし、まだ謎のままです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2017.04.25 10:34

スマートポインタのデストラクタが、あなたのバージョンではクラスのデストラクタの 前に呼ばれ、私のバージョンでは逆になっているのはなぜですか(たとえコンストラクタがパブリックであっても)?