Bu, mql5 belgelerine bir örnektir. İşte o sayfaya bir bağlantı . Ve kod aşağıdadır.
//+------------------------------------------------------------------+//| Класс с конструктором по умолчанию |//+------------------------------------------------------------------+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
}
Const olmayan nesnelerin const nesnelere dönüştürülmesi hangi temelde iptal edildi? Yüzlerce dahili yöntem benim için çalışmayı durdurdu, çünkü bunlar const değiller ve görücüler artık const nesnelerinde kullanılamaz. Yüzlerce işlevim CObject.Compare(...) sabitine bağlı ve şimdi hepsi çalışmıyor!
"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
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));
}
Ve şimdi soruya dikkat edin: hadi CObject'in imzasını silelim. karşılaştırmak():
virtualint Compare(
CObject const * node, // элемент int mode= 0// вариант
) const
TAMAM. bu, bir const düğüm nesnesini kabul eden bir const yöntemidir. Düğüm sabiti bildirmek onun hakkıdır. Ancak Şimdi Karşılaştır hangi temelde yalnızca düğümün sabit yöntemleriyle çalışmalı? Karşılaştırma için düğümün const yöntemlerine sahip olması gerekmez. Ancak, yalnızca nesnenin karmaşık olduğu ve sabit yöntemleri olmadığı gerekçesiyle, şimdi tüm sonuçlarıyla standart kitaplığı kullanamayacağı ortaya çıktı !!!
Statik yapıcılar yasaklanmışsa, karmaşık statik nesneleri yerleştirmeyi nasıl sipariş edersiniz?
class A
{
public :
void PrintMyName(){ printf ( "my name A" );}
};
class B
{
public :
static A* a; //В этом месте как прикажете объект инициализировать?
};
"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
Doğru, öyle olmalı, yoksa belirtmenin ne anlamı var?
"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
Lütfen tüm kodunuzu gönderin.
Bu, mql5 belgelerine bir örnektir. İşte o sayfaya bir bağlantı . Ve kod aşağıdadır.
Görünüşe göre güncelleme, yalnızca statik sınıf veri üyelerinin zorunlu olarak yerleştirilmesini değil,
ama aynı zamanda parametrik kurucunun örtük çağrısını da iptal etti.
Açık bir çağrı kullanın:
Const olmayan nesnelerin const nesnelere dönüştürülmesi hangi temelde iptal edildi?
Her şey yolunda gidiyor - hata veya uyarı yok
Kalan herhangi bir hata varsa, o zaman yalnızca yapıdadır, ancak sonunda onlara ulaşacaktır.Her şey hatasız veya uyarısız derlenir.
"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
Ve şimdi soruya dikkat edin: hadi CObject'in imzasını silelim. karşılaştırmak():
TAMAM. bu, bir const düğüm nesnesini kabul eden bir const yöntemidir. Düğüm sabiti bildirmek onun hakkıdır. Ancak Şimdi Karşılaştır hangi temelde yalnızca düğümün sabit yöntemleriyle çalışmalı? Karşılaştırma için düğümün const yöntemlerine sahip olması gerekmez. Ancak, yalnızca nesnenin karmaşık olduğu ve sabit yöntemleri olmadığı gerekçesiyle, şimdi tüm sonuçlarıyla standart kitaplığı kullanamayacağı ortaya çıktı !!!Şimdi statik üyeler yerleştirilmelidir.
Statik yapıcılar yasaklanmışsa, karmaşık statik nesneleri yerleştirmeyi nasıl sipariş edersiniz?
"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
Doğru, öyle olmalı, yoksa belirtmenin ne anlamı var?
Ama değil
void f(A* a)"A" sabit olmayan bir yöntem içeriyorsa, ancak kendisi işleve bir const nesnesi olarak iletiliyorsa, bu sabit olmayan yöntemi işlevde çağırmak artık mümkün değildir.
Statik yapıcılar yasaklanmışsa, karmaşık statik nesnelerin yerleşimini nasıl sipariş edersiniz?