Hatalar, hatalar, sorular - sayfa 1874

 
Koldun Zloy :

Yapıcının özel olması gerektiğinden eminseniz, başka yolu yoktur.

Akıllı işaretçi, basit bir işaretçi içeren ve zamanında silinmesini sağlayan bir nesnedir.

Bu en kolay seçenektir.

Daha karmaşık akıllı işaretçiler de vardır.

Bu kitapta onlar hakkında çok iyi yazılmış: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml

Teşekkür ederim! Çeşitli seçenekler denedim ama işe yaramıyor.
 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 ()
{
}

Aslında, çalışmaması mantıklı. Bir akıllı işaretçi yıkıcısını sınıf yıkıcısından önce çağrılmaya zorlayamazsınız.

 

Derleyici, hatayı ve oluştuğu yeri belirtmek yerine tanımsız bir dahili hata #112 verir.

 class CLASS {};

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

void OnStart ()
{
  CLASS2<CLASS>::Func;  
}
 
fxsaber :
Teşekkür ederim! Çeşitli seçenekler denedim ama işe yaramıyor.

Aslında, çalışmaması mantıklı. Bir akıllı işaretçi yıkıcısını sınıf yıkıcısından önce çağrılmaya zorlayamazsınız.


Şu şekilde deneyin:

 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 ()
{
}

Ne yaptığınızı bilmiyorum, ancak MQL'de bir kurucuyu private yapmak yalnızca bir singleton için anlamlıdır.

 
Koldun Zloy :

Şu şekilde deneyin:

Ayrıntılı örnek için teşekkürler! Ne yazık ki, yapıcı onun içinde özel değil. Kapalıyken tabii ki böyle çalışmıyor.

Benim için gerekli, herkesten gizlenmiş bir nesne vardı. Aynı zamanda, bu türden başka bir nesne hiçbir şekilde oluşturulamadı.

 
Bu durumda doğru mu?
 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;
}

yürütme günlüğüne çıktı mı?
 void CLASS::~CLASS()
void CLASS::~CLASS()
delete invalid pointer


Ve bir yapıcı/yıkıcının __FUNCSIG__ öğesinin bir void türü ürettiği doğru mu?

 
Koldun Zloy :

Şu şekilde deneyin:

Akıllı işaretçi yıkıcı neden sizin sürümünüzdeki sınıf yıkıcısından önce çağrılıyor ve benimkinde tam tersi (kurucu herkese açık olsa bile)?
 
fxsaber :

Benim için gerekli, herkesten gizlenmiş bir nesne vardı. Aynı zamanda, bu türden başka bir nesne hiçbir şekilde oluşturulamadı.


Buna " Singleton " denir.

Neden sana yakışmadığını söylüyorsun?

İşte bir singleton örneği.

 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 :
Bu durumda doğru mu?
yürütme günlüğüne çıktı mı?


Ve bir yapıcı/yıkıcının __FUNCSIG__ öğesinin bir void türü ürettiği doğru mu?


Asla yapma

 delete & this ;
 
fxsaber :
Bu durumda bunu yürütme günlüğünde yayınlamak doğru mu?

Ve bir yapıcı/yıkıcının __FUNCSIG__ öğesinin bir void türü ürettiği doğru mu?


Evet evet.
 
Koldun Zloy :


Buna " Singleton " denir.

Neden sana yakışmadığını söylüyorsun?

İşte bir singleton örneği.

Çok teşekkürler, işe yarıyor!

 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 ()
{
}

Ama bir sır olarak kalıyor

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2017.04.25 10:34

Akıllı işaretçi yıkıcı neden sizin sürümünüzdeki sınıf yıkıcısından önce çağrılıyor ve benimkinde tam tersi (kurucu herkese açık olsa bile)?