오류, 버그, 질문 - 페이지 1951

 
Stanislav Korotky :

함수에서 익명 개체 인스턴스를 반환하는 방법이 있습니까?

매크로로 대체합니다.
 
fxsaber :
매크로로 대체합니다.

작동 안 할 것이다. 이것은 클래스 메서드 이고 param은 실제로 개체에서 가져옵니다. 예를 들어 여기서는 단순화했습니다.

 
Stanislav Korotky :

작동 안 할 것이다. 이것은 클래스 메서드 이고 param은 실제로 개체에서 가져옵니다. 예를 들어 여기서는 단순화했습니다.

물론 원래 문제에 익숙해지는 것이 좋습니다 ...

포인터를 반환하려면 - 그렇지 않습니까?

 

Stanislav Korotky :

추가 내부 복사본을 생성하고 return 문 을 사용하려면 클래스에 복사 생성자가 필요하다는 점을 제외하고는 작동합니다. 함수가 종료되면 복사가 못되지만 복사 자체는 제외하고 싶습니다.


Class function()
{
   int param = 0 ;
  Class obj(param);
   return obj;
}

물론 함수를 종료한 후 지역 변수가 소멸되어야 합니다.
new를 사용하고 포인터를 반환합니다. 문제가 무엇입니까?

리소스 제어가 필요한 경우 스마트 포인터와 같은 래퍼를 사용합니다.
아마도 싱글톤이나 빌더와 같은 생성 패턴이 있는 것이 당신에게 적합할 것입니다.

 
fxsaber :

물론 원래 문제에 대해 아는 것이 좋습니다 ...

포인터를 반환하려면 - 그렇지 않습니까?

원래 표지판에 있던 것입니다. 그러나 클라이언트 코드는 이를 제거할 책임이 있으며 눈 깜짝할 사이에 링크가 매달려 있다는 사실은 말할 것도 없이 많은 쓰레기입니다.

 
Sergey Dzyublik :

물론 함수를 종료한 후 지역 변수가 소멸되어야 합니다.

new를 사용하고 포인터를 반환합니다. 문제가 무엇입니까?

리소스 제어가 필요한 경우 스마트 포인터와 같은 래퍼를 사용합니다.
아마도 싱글톤이나 빌더와 같은 생성 패턴이 있는 것이 당신에게 적합할 것입니다.

포인터가 있습니다. 불편합니다(위에서 답변함). '스마트'하게 바라보려고 노력했습니다. 하지만 MQL의 경우 스마트 포인터가 한 단계 더 많은 참조 수준만 제공하므로 모니터링해야 한다는 인상을 받았습니다. 결국 스마트 포인터란 무엇입니까? 원본 링크를 포함하는 래퍼 개체입니다. 누가 언제 래퍼를 청소합니까? ;-) 기성품 솔루션이 있으면 개인 플리즈에서 버리십시오. 진행 중인 테스트 케이스가 있습니다.

 
Stanislav Korotky :

결국 스마트 포인터는 무엇입니까? 원본 링크를 포함하는 래퍼 개체입니다. 누가 언제 래퍼를 청소합니까? ;-) 기성품 솔루션이 있으면 개인 플리즈에서 버리십시오. 진행 중인 테스트 케이스가 있습니다.


shared_ptr을 사용합니다.
이 래퍼는 정리할 필요가 없고 복사해야 하며 필요한 리소스가 있는 인스턴스가 몇 개나 남았는지, 이 리소스가 언제 해제되는지가 shared_ptr의 핵심입니다.


적어도 나에게는 기성품 솔루션이 없습니다. 적응 C++-snye.

 
Sergey Dzyublik :

적어도 나에게는 기성품 솔루션이 없습니다. 적응 C++-snye.

이것은 이해할 수 있습니다. 이것이 내가하는 일이지만 MQL이 "추적지"를 만드는 것을 허용하지 않을 것이라는 인상을 이미 받았습니다.

 
Stanislav Korotky :

함수에서 익명 개체 인스턴스를 반환하는 방법이 있습니까?

여기에서 이미 언급했듯이 가장 정확한 방법은 함수에서 스마트 포인터를 반환하는 것입니다. 이 모든 것이 MQL에서 구현됩니다. 사실, 포인터에 의한 전환은 전환 연산자가 아니라 메서드를 통해 구현되어야 하기 때문에 C ++에서처럼 사용하기가 편리하지 않습니다. 그건 그렇고, 고려 중인 작업의 경우 반드시 shared_ptr이 아니라 unique_ptr이면 충분하다고 생각합니다.

글쎄, 또는 옵션으로, 함수 내부에 생성된 포인터가 프로그램이 끝날 때 지워지는 특정 전역 배열에 즉시 배치되도록 합니다. 이 경우 사용자는 삭제가 아닌 특수 함수를 호출하여 언제든지 개체의 메모리를 해제할 수 있습니다. WinApi의 CloseHandle과 유사합니다.

추가 내부 복사본을 생성 하고 return 문 을 사용하려면 클래스에 복사 생성자가 필요하다는 점을 제외하고는 작동합니다. 함수가 종료되면 복사가 못되지만 복사 자체는 제외하고 싶습니다.

아마도 컴파일러는 자체적으로 모든 것을 최적화하고 인라인하여 불필요한 복사를 제거할 만큼 충분히 똑똑할 것입니다. 그러나 이것은 확인이 필요합니다. 누군가가 테스트와 측정을 한다면 좋을 것입니다. 그리고 나 자신도 종종 그러한 딜레마에 의아해합니다.

 
Alexey Navoykov :

여기에서 이미 언급했듯이 가장 정확한 방법은 함수에서 스마트 포인터를 반환하는 것입니다. 이 모든 것이 MQL에서 구현됩니다. 사실, 포인터에 의한 전환은 전환 연산자가 아니라 메서드를 통해 구현되어야 하기 때문에 C ++에서처럼 사용하기가 편리하지 않습니다. 그건 그렇고, 고려 중인 작업의 경우 반드시 shared_ptr이 아니라 unique_ptr이면 충분하다고 생각합니다.

글쎄, 또는 옵션으로, 함수 내부에 생성된 포인터가 프로그램이 끝날 때 지워지는 특정 전역 배열에 즉시 배치되도록 합니다. 이 경우 사용자는 삭제가 아닌 특수 함수를 호출하여 언제든지 개체의 메모리를 해제할 수 있습니다. WinApi의 CloseHandle과 유사합니다.

아마도 컴파일러는 자체적으로 모든 것을 최적화하고 인라인하여 불필요한 복사를 제거할 만큼 충분히 똑똑할 것입니다. 그러나 이것은 확인이 필요합니다. 누군가가 테스트와 측정을 한다면 좋을 것입니다. 그리고 나 자신도 종종 그러한 딜레마에 의아해합니다.

나는 아래에 내 구현을 게시합니다. 모두 동일하게 이러한 스마트 포인터는 일시적으로 생성되며 결과적으로 ;-)보다 더 많은 객체가 생성되고 고정됩니다.

물론, 전역 배열에 대한 옵션을 염두에 두긴 하지만 얼마나 추악한지! 게다가 나는 타이머로 청소하고 싶었고(프로그램이 며칠 동안 작동할 수 있기 때문에) MQL의 타이머는 클래스/객체에 연결할 수 없습니다. 전역 처리기에서만 선택됩니다.

컴파일러는 여기에서 도움이 되지 않습니다. 확인됩니다. 로컬 개체는 반환에 의해 복제된 다음 못을 박습니다. 이 경우 최적의 이동이 없습니다.

 template < typename T>
class auto_ptr
{
   private :

     class Reference
    {
       public :
         int count;
        Reference(): count( 0 ) {}
    };

    T *data;
    Reference *reference;

    void remove()
    {
      if(reference != NULL)
      {
        reference.count--;
        if(reference.count == 0)
        {
          delete data;
          delete reference;
        }
      }
    }

    
   public :
    auto_ptr(): data( NULL ), reference( NULL )
    {
    }
    auto_ptr(T *ptr): data(ptr), reference(ptr == NULL ? NULL : new Reference())
    {
       if (reference != NULL ) reference.count++;
    }
    auto_ptr(auto_ptr<T> &ref): data(ref.data), reference(ref.reference)
    {
      reference.count++;
    }
    
    ~auto_ptr()
    {
      remove();
    }
    
     void operator =(auto_ptr<T> &next)
    {
       if (& this != &next)
      {
        remove();
        
        data = next.data;
        reference = next.reference;
        reference.count++;
      }
    }
};