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

 
Fleder :
모든 코드를 게시하십시오.
이것은 mql5 문서의 예입니다. 다음은 해당 페이지에 대한 링크 입니다. 그리고 아래는 코드입니다.
 //+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
class CFoo
  {
   datetime           m_call_time;     // время последнего обращения к объекту
public :
   //--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
                     CFoo( const datetime t= 0 ){m_call_time=t;};
   //--- конструктор копирования 
                     CFoo( const CFoo &foo){m_call_time=foo.m_call_time;};
 
   string ToString(){ return ( TimeToString (m_call_time, TIME_DATE | TIME_SECONDS ));};
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
   CFoo foo1( TimeCurrent ());     // явный вызов параметрического конструктора
   CFoo foo2();                   // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3= D'2009.09.09' ;       // неявный вызов параметрического конструктора
   CFoo foo40(foo1);             // явный вызов конструктора копирования
   CFoo foo41=foo1;               // неявный вызов конструктора копирования
   CFoo foo5;                     // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
   CFoo *pfoo6= new CFoo();       // динамическое создание объекта и получение указателя на него
   CFoo *pfoo7= new CFoo( TimeCurrent ()); // ещё один вариант динамического создания объекта
   CFoo *pfoo8= GetPointer (foo1); // теперь pfoo8 указывает на объект foo1
   CFoo *pfoo9=pfoo7;             // pfoo9 и pfoo7 указывают на один и тот же объект
   // CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
   Print ( "foo1.m_call_time=" ,foo1.ToString());
   Print ( "foo2.m_call_time=" ,foo2.ToString());
   Print ( "foo3.m_call_time=" ,foo3.ToString());
   Print ( "foo4.m_call_time=" ,foo4.ToString());
   Print ( "foo5.m_call_time=" ,foo5.ToString());
   Print ( "pfoo6.m_call_time=" ,pfoo6.ToString());
   Print ( "pfoo7.m_call_time=" ,pfoo7.ToString());
   Print ( "pfoo8.m_call_time=" ,pfoo8.ToString());
   Print ( "pfoo9.m_call_time=" ,pfoo9.ToString());
//--- удалим динамически созданные объекты
   delete pfoo6;
   delete pfoo7;
   //delete pfoo8;  // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
   //delete pfoo9;  // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
  }
 
Tron_KZ :
이것은 mql5 문서의 예입니다. 다음은 해당 페이지에 대한 링크 입니다. 그리고 아래는 코드입니다.

업데이트를 통해 정적 클래스 데이터 멤버의 필수 배치 뿐만 아니라

매개변수 생성자의 암시적 호출도 취소했습니다.

명시적 호출 사용:

   CFoo foo1( TimeCurrent ());     // явный вызов параметрического конструктора
   CFoo foo2();                   // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3( D'2009.09.09' );     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                     // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
const가 아닌 객체 에서 const 객체로의 변환이 취소된 근거는 무엇입니까? 수백 가지 내부 메서드가 작동을 멈췄습니다. 왜냐하면 그것들은 const가 아니고 const 객체에서 seer를 더 이상 사용할 수 없기 때문입니다. 수백 개의 내 함수가 상수 CObject.Compare(...)에 연결되어 있으며 이제 모두 작동하지 않습니다!
 
mql5의 OOP가 특정 변경 사항을 겪은 것 같습니다. 조용히...
 
C-4 :
const가 아닌 객체 에서 const 객체로의 변환이 취소된 근거는 무엇입니까?

모든 것이 잘 컴파일됩니다. 오류나 경고가 없습니다.

 class A {};
void f( const A& a ) {}
void OnStart ()
{
        A a; //не const A
        f( a );
}
오류가 남아 있으면 구조체에만 있지만 결국에는 오류가 발생합니다.
 
A100 :

모든 것이 오류나 경고 없이 컴파일됩니다.

"A"에 상수가 아닌 메서드가 포함되어 있지만 그 자체가 const 객체 로 함수에 전달되면 더 이상 함수에서 이 상수가 아닌 메서드를 호출할 수 없습니다.

 class A 
{
   public :
       void PrintMyName(){ printf ( "my name A" );}
};

void f( const A* a)
{
   a.PrintMyName(); //Хренушки. Теперь PrintMyName должен быть константым.
} 

void OnStart ()
{
        A a; //не const A
        f( GetPointer (a));
}

이제 질문에 주의하십시오. CObject의 서명을 지우겠습니다. 비교하다():

 virtual int   Compare(
   CObject const *  node,       // элемент 
   int             mode= 0        // вариант 
   ) const
확인. 이것은 const 노드 객체를 받아들이는 const 메소드입니다. 노드 상수를 선언하는 것은 그의 권리입니다. 그러나 이제 Compare는 어떤 기준으로 노드의 상수 메서드에서만 작동합니까? 노드에는 비교를 위해 const 메서드가 필요하지 않습니다. 그러나 객체가 복잡하고 상수 메서드가 없다는 이유만으로 이제 모든 결과와 함께 표준 라이브러리를 사용할 수 없다는 것이 밝혀졌습니다!!!

 
mql5 :
이제 정적 멤버를 배치해야 합니다.

정적 생성자가 금지된 경우 복잡한 정적 개체의 배치를 어떻게 주문합니까?

 class A 
{
   public :
       void PrintMyName(){ printf ( "my name A" );}
};

class B
{
   public :
      static A* a; //В этом месте как прикажете объект инициализировать? 
};
 
C-4 :

"A"에 상수가 아닌 메서드가 포함되어 있지만 그 자체가 const 객체 로 함수에 전달되면 더 이상 함수에서 이 상수가 아닌 메서드를 호출할 수 없습니다.

맞아, 그래야지, 그렇지 않으면 지적하는 요점이 무엇입니까?

 void f( const A* a)

하지만

 void f(A* a)
 
C-4 :

"A"에 상수가 아닌 메서드가 포함되어 있지만 그 자체가 const 객체 로 함수에 전달되면 함수에서 이 비-const 메서드를 더 이상 호출할 수 없습니다.

음, 그것은 실제로 풍수입니다.
 
C-4 :

정적 생성자가 금지된 경우 복잡한 정적 개체의 배치를 어떻게 주문합니까?

 class A 
{
   public :
       void PrintMyName(){ printf ( "my name A" );}
};

class B
{
   public :
       static A* a;
};

A* B::a = new A;