Errori, bug, domande - pagina 1135

 
Fleder:
Per favore, pubblica tutto il tuo codice.
Questo è un esempio dalla documentazione di mql5. Ecco il link a quella pagina. E sotto c'è questo codice.
//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
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:
Questo è un esempio dalla documentazione di mql5. Ecco un link a quella pagina. E sotto c'è questo codice.

Sembra che con l'aggiornamento sia stato introdotto non solo ilposizionamento obbligatorio dei membri di dati statici della classe,

ma ha anche rimosso la chiamata implicita al costruttore parametrico.

Usare una chiamata esplicita:

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
Su quale base è stata abolita la conversione degli oggetti non costanti in oggetti costanti? Ho centinaia di metodi interni che smettono di funzionare, solo perché non sono costanti, e le viste non possono essere usate in oggetti costanti ora. Centinaia di mie funzioni sono legate alla costante CObject.Compare(...) e ora non funzionano tutte!
 
L'OOP in mql5 sembra aver subito dei cambiamenti specifici. Di nascosto...
 
C-4:
Su quali basi hanno cancellato la conversione di oggetti non costanti in costanti?

Tutto si compila normalmente - nessun errore o avvertimento

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
Se ci sono degli errori, è solo in struttura, ma alla fine ci arriveranno
 
A100:

Tutto si compila senza errori o avvertimenti

Se "A" contiene un metodo non costante, ma è esso stesso passato a una funzione come oggetto costante, allora questo metodo non costante non può essere chiamato nella funzione ora.

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));
}

E ora attenzione domanda: cancelliamo il CObject.Compare():

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
O.k. è un metodo costante che prende un nodo oggetto costante. È suo diritto dichiarare il nodo come costante. Ma su quale base Compare dovrebbe ora lavorare solo con metodi costanti di nodo? Il nodo non è obbligato ad avere metodi costanti per il bene di Compare. Ma si scopre che solo per il fatto che l'oggetto è complesso e non ha metodi costanti, ora non può usare la libreria standard con tutto ciò che implica!!!

 
mql5:
Ora è obbligatorio posizionare i membri statici.

E come si fa a piazzare oggetti statici complessi se i costruttori statici non sono ammessi?

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

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

Se "A" contiene un metodo non costante, ma è esso stesso passato alla funzione come oggetto costante, allora questo metodo non costante non può essere chiamato nella funzione.

Esatto, è così che dovrebbe essere, altrimenti che senso ha specificare

void f(const A* a)

invece di

void f(A* a)
 
C-4:

Se "A" contiene un metodo non costante, ma è esso stesso passato alla funzione come oggetto costante, allora questo metodo non costante non può essere chiamato nella funzione.

In realtà questo è il modo elegante di farlo.
 
C-4:

E come si fa a piazzare oggetti statici complessi se i costruttori statici non sono ammessi?

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

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

A* B::a = new A;