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(constdatetime 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 |//+------------------------------------------------------------------+voidOnStart()
{
// 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_timePrint("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
}
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!
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 должен быть константым.
}
voidOnStart()
{
A a; //не const A
f(GetPointer(a));
}
E ora attenzione domanda: cancelliamo il CObject.Compare():
virtualint 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!!!
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
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.
Per favore, pubblica tutto il tuo codice.
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:
Su quali basi hanno cancellato la conversione di oggetti non costanti in costanti?
Tutto si compila normalmente - nessun errore o avvertimento
Se ci sono degli errori, è solo in struttura, ma alla fine ci arriverannoTutto 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.
E ora attenzione domanda: cancelliamo il CObject.Compare():
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!!!Ora è obbligatorio posizionare i membri statici.
E come si fa a piazzare oggetti statici complessi se i costruttori statici non sono ammessi?
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
invece di
void f(A* a)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.
E come si fa a piazzare oggetti statici complessi se i costruttori statici non sono ammessi?