Ошибки, баги, вопросы - страница 1874

 
Koldun Zloy:

Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.

Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.

Это самый простой вариант.

Бывают и более сложные умные указатели.

Очень хорошо про них написано в этой книге:  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()
{
}

Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.

 

Компилятор вместо указания ошибки и места, где она возникает, выдает неопределенный internal error #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 делать конструктор закрытым, имеет смысл только для синглтона.

 
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:

Попробуйте так:

Почему в Вашем варианте деструктор умного указателя вызывается раньше деструктора класса, а в моем - наоборот (даже если конструктор public)?
 
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

Почему в Вашем варианте деструктор умного указателя вызывается раньше деструктора класса, а в моем - наоборот (даже если конструктор public)?
Причина обращения: