오류, 버그, 질문 - 페이지 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에서 생성자를 비공개로 만드는 것은 싱글 톤에 대해서만 의미가 있습니다.

 
Koldun Zloy :

다음과 같이 시도하십시오.

자세한 예시 감사합니다! 불행히도 생성자는 private가 아닙니다. 물론 닫힌 상태에서는 그렇게 작동하지 않습니다.

나에게 필요한 것은 모든 사람에게 숨겨진 대상이 있다는 것입니다. 동시에 이 유형의 다른 개체는 어떤 식으로든 생성할 수 없습니다.

 
이 경우 맞습니까?
 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 :

나에게 필요한 것은 모든 사람에게 숨겨진 대상이 있다는 것입니다. 동시에 이 유형의 다른 개체는 어떤 식으로든 생성할 수 없습니다.


이것을 " 싱글톤 "이라고 합니다.

왜 어울리지 않는다고 합니까?

다음은 싱글톤의 예입니다.

 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 :


이것을 " 싱글톤 "이라고 합니다.

왜 어울리지 않는다고 합니까?

다음은 싱글톤의 예입니다.

감사합니다. 작동합니다!

 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

스마트 포인터 소멸자가 귀하의 버전에서는 클래스 소멸자 보다 먼저 호출되고, 제 버전에서는 그 반대의 경우도 마찬가지입니다(생성자가 공용인 경우에도)?