Ayrıca kötü bir yaklaşım değil, anladığım kadarıyla bu yaklaşımların her ikisi de yalnızca bir parametreyi (farklı türlerde de olsa) aktarmak/okumak için tasarlanmıştır.
Ancak çok sayıda parametre varsa ve hepsini temel sınıfa sığdıramıyorsanız ne kadar ilginç olur?
Anladığım kadarıyla, ayrıca geçmekte olduğumuz parametrenin indeksini de girin (sınıfta da, indekse göre yığılmış parametrelerle bir dizi oluşturabilirsiniz)?
aynı şeyi anlamadım...
Örneğimde bir dizin var, ancak açıkça sayısal değil, bir numaralandırma....
Bana öyle geliyor ki, geliştiriciler güvenlik uğruna işlevsellikten ödün vererek belirli adımlar atmayacaklar (bir yandan bu doğru).
Bildiriyorum.
Talep şöyleydi:
...
Öneririm:
1. Şekiller[10] dizisinin CShape'den türetilen sınıf örnekleriyle nasıl doğru şekilde doldurulacağını belirtmek için El Kitabının "Polimorfizm" bölümünü netleştirin (bir örnek verin).
2. Satırın yazımını kontrol edin:
CShape[ 10 ] shapes; // массив объектов CShape
3. Sınıfları bildirirken, beyan edilen sınıfın adından hemen sonra kaşlı ayraç koymanın gerekli olup olmadığını açıklayın:
sınıf CShape{};
sınıf CCircle{} : genel CShape
sınıf CSquare{} : genel CShape
Cevap:
Raşid Umarov2011.04.11 15:17
Yardımın yazıldığı sırada, bazı noktalar dokümantasyon için henüz net değildi. Bu anı düzelteceğiz ve doğru kodu ekleyeceğiz. Mesajın için teşekkürler.
Yardıma genişletilmiş bir açıklama eklenecek, işte ondan bir alıntı:
Programda farklı türde nesneler (CCircle ve CSquare) kullandığımız, ancak aynı CShape temel türünden miras aldığımız varsayılmaktadır. Polimorfizm, CShape temel türünde bir dizi nesne oluşturmamıza izin verir, ancak bu diziyi bildirirken nesnelerin kendileri hala bilinmiyor ve türleri tanımsız.
Dizinin her bir elemanında ne tür bir nesnenin bulunacağına ilişkin karar, doğrudan programın yürütülmesi sırasında verilecektir. Bu, ilgili sınıfların nesnelerinin dinamik olarak oluşturulmasını ve dolayısıyla nesnelerin kendileri yerine nesne işaretçilerini kullanma ihtiyacını ifade eder.
Nesnelerin dinamik olarak oluşturulması için yeni operatör kullanılır, bu tür her bir nesne, silme operatörü kullanılarak bağımsız ve açıkça silinmelidir. Bu nedenle, CShape türünde bir işaretçi dizisi bildireceğiz ve her bir öğesi için komut dosyası örneğinde gösterildiği gibi gerekli türde ( yeni Sınıf_adı) bir nesne oluşturacağız:
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart ()
{
//--- объявим массив указателей объектов базового типа
CShape *shapes[ 5 ]; // массив указателей на объекты CShape//--- здесь заполняем массив производными объектами//--- объявим указатель на объект типа CCircle
CCircle *circle= new CCircle();
//--- задаем свойства объекта по указателю circle
circle.SetRadius( 2.5 );
//--- поместим в shapes[0] значение указателя
shapes[ 0 ]=circle;
//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]
circle= new CCircle();
shapes[ 1 ]=circle;
circle.SetRadius( 5 );
//--- тут мы намеренно "забыли" задать значение для shapes[2]//circle=new CCircle();//circle.SetRadius(10);//shapes[2]=circle;//--- для неиспользуемого элемента установим значение NULL
shapes[ 2 ]= NULL ;
//--- создаем объект CSquare и запишем его указатель в shapes[3]
CSquare *square= new CSquare();
square.SetSide( 5 );
shapes[ 3 ]=square;
//--- создаем объект CSquare и запишем его указатель в shapes[4]
square= new CSquare();
square.SetSide( 10 );
shapes[ 4 ]=square;
//--- массив указателей есть, получим его размерint total= ArraySize (shapes);
//--- пройдем в цикле по всем указателям в массиве for ( int i= 0 ; i< 5 ;i++)
{
//--- если по указанному индексу указатель является валиднымif ( CheckPointer (shapes[i])!= POINTER_INVALID )
{
//--- выведем в лог тип и площадь фигурыPrintFormat ( "Объект типа %d имеет площадь %G" ,
shapes[i].GetType(),
shapes[i].GetArea());
}
//--- если указатель имеет тип POINTER_INVALIDelse
{
//--- сообщим об ошибкеPrintFormat ( "Объект shapes[%d] не инициализирован! Его указатель %s" ,
i, EnumToString ( CheckPointer (shapes[i])));
}
}
//--- мы должны самостоятельно уничтожить все созданные динамические объектыfor ( int i= 0 ;i<total;i++)
{
//--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMICif ( CheckPointer (shapes[i])== POINTER_DYNAMIC )
{
//--- сообщим об удаленииPrintFormat ( "Удаляем shapes[%d]" ,i);
//--- уничтожим объект по его указателюdelete shapes[i];
}
}
}
Bir nesne silme operatörü tarafından yok edildiğinde, işaretçisinin tipinin kontrol edilmesi gerektiğini unutmayın. Sil kullanılarak yalnızca POINTER_DYNAMIC işaretçisi olan nesneler silinebilir, farklı türdeki işaretçiler için bir hata alınacaktır.
Bence bu örnek, bir dizi işaretçi oluşturma fikrini tamamen ortaya koyuyor.
Raşit Umarov2011.04.11 10:31
Mesaj için teşekkürler, #2 ve #3 düzeltildi. Yardımın yeni sürümlerinde olacak
Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?
Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?
Bir yapının/sınıfın üyesi bir şeydir, ancak bir yöntem başka bir şeydir.
const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.
const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.
Okuyabilmek güzel... :)
Ayrıca kötü bir yaklaşım değil, anladığım kadarıyla bu yaklaşımların her ikisi de yalnızca bir parametreyi (farklı türlerde de olsa) aktarmak/okumak için tasarlanmıştır.
Ancak çok sayıda parametre varsa ve hepsini temel sınıfa sığdıramıyorsanız ne kadar ilginç olur?
Anladığım kadarıyla, ayrıca geçmekte olduğumuz parametrenin indeksini de girin (sınıfta da, indekse göre yığılmış parametrelerle bir dizi oluşturabilirsiniz)?
aynı şeyi anlamadım...
Örneğimde bir dizin var, ancak açıkça sayısal değil, bir numaralandırma....
Unut gitsin, buna değmez.
Interesting :
Genel olarak https://www.mql5.com/ru/forum/3566/page6#comment_58280 sorunun tartışılmasının ardından Yönetim Kurulu'na talep gönderdim.
1. Bilmiyorum, bilmiyorum.
Bana öyle geliyor ki, geliştiriciler güvenlik uğruna işlevsellikten ödün vererek belirli adımlar atmayacaklar (bir yandan bu doğru).
Bildiriyorum.
Talep şöyleydi:Öneririm:
1. Şekiller[10] dizisinin CShape'den türetilen sınıf örnekleriyle nasıl doğru şekilde doldurulacağını belirtmek için El Kitabının "Polimorfizm" bölümünü netleştirin (bir örnek verin).
2. Satırın yazımını kontrol edin:
3. Sınıfları bildirirken, beyan edilen sınıfın adından hemen sonra kaşlı ayraç koymanın gerekli olup olmadığını açıklayın:
sınıf CShape{};
sınıf CCircle{} : genel CShape
sınıf CSquare{} : genel CShape
Cevap:
Yardıma genişletilmiş bir açıklama eklenecek, işte ondan bir alıntı:
Programda farklı türde nesneler (CCircle ve CSquare) kullandığımız, ancak aynı CShape temel türünden miras aldığımız varsayılmaktadır. Polimorfizm, CShape temel türünde bir dizi nesne oluşturmamıza izin verir, ancak bu diziyi bildirirken nesnelerin kendileri hala bilinmiyor ve türleri tanımsız.
Dizinin her bir elemanında ne tür bir nesnenin bulunacağına ilişkin karar, doğrudan programın yürütülmesi sırasında verilecektir. Bu, ilgili sınıfların nesnelerinin dinamik olarak oluşturulmasını ve dolayısıyla nesnelerin kendileri yerine nesne işaretçilerini kullanma ihtiyacını ifade eder.
Nesnelerin dinamik olarak oluşturulması için yeni operatör kullanılır, bu tür her bir nesne, silme operatörü kullanılarak bağımsız ve açıkça silinmelidir. Bu nedenle, CShape türünde bir işaretçi dizisi bildireceğiz ve her bir öğesi için komut dosyası örneğinde gösterildiği gibi gerekli türde ( yeni Sınıf_adı) bir nesne oluşturacağız:
Bir nesne silme operatörü tarafından yok edildiğinde, işaretçisinin tipinin kontrol edilmesi gerektiğini unutmayın. Sil kullanılarak yalnızca POINTER_DYNAMIC işaretçisi olan nesneler silinebilir, farklı türdeki işaretçiler için bir hata alınacaktır.
Mesaj için teşekkürler, #2 ve #3 düzeltildi. Yardımın yeni sürümlerinde olacak
Soru. Standart kitaplık aşağıdaki satırları kullanır
Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?
Yedelkin :
..................
Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?
Soru. Standart kitaplık aşağıdaki satırları kullanır
Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?
Bir yapının/sınıfın üyesi bir şeydir, ancak bir yöntem başka bir şeydir.
const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.
Bir yapının/sınıfın üyesi bir şeydir, ancak bir yöntem başka bir şeydir.
const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.
Vay. Teşekkür ederim! Ve kafamı kırdım.
Bu arada, konuşma geldiğinden beri mantıklı bir soru - geçici bir talimat yok ve beklenmiyor mu?
Ve nasıl uygulanabilir? , çünkü akışlar birbirleriyle etkileşmezler,
Şimdi, veriler iş parçacıkları arasında serbestçe aktarılabilseydi, evet, böyle bir talimata ihtiyaç olurdu.
Tünaydın.
Bir soru
yukarıdaki koda göre
neyi yanlış yaptım yoksa MT5'te temelde ulaşılamaz mı?
(Açık olduğunu düşündüğüm gibi) - dosya adı değişkenlerinde yeniden tanımlanmış adlar almak istiyorum ...