Şablon parametreli derleyici hatası = void* - sayfa 19

 
pavlick_ :

Kendini imha? - bu yeni bir şey :).

Evet, kendi kendini imha etme. Bunun "yığın" nesneler ile dinamik nesneler arasındaki fark olduğunun farkında olduğunuzu varsayıyorum - size kendilerini ne zaman silmeleri gerektiğini sormuyorlar, ancak ana program bloğundan çıktıklarında yapıyorlar :)
 
Ilya Malev :
Evet, kendi kendini imha etme. Bunun "yığın" nesneler ile dinamik nesneler arasındaki fark olduğunun farkında olduğunuzu varsayıyorum - size kendilerini ne zaman silmeleri gerektiğini sormuyorlar, ancak ana program bloğundan çıktıklarında yapıyorlar :)

Kopyala/taşı yapıcıları/operatörlerini duymuş olmalısınız, değil mi?:

obj o;
{
   obj q;
   o = q;
   o = move(q);   // С++ вариант, более эффективный
}
 
pavlick_ :

Kopyala/taşı yapıcıları/operatörlerini duymuş olmalısınız, değil mi?:

Yani, bu kritik anın bekçisi olacağız ve sadece geç kalmamışsak, yine de kopyalayacak mıyız? :çok komik:

OOP'yi gerçekten sevmediğimiz için mi yoksa başka gizli sebepler var mı?

 
Ilya Malev :

Yani, bu kritik anın bekçisi olacağız ve sadece geç kalmamışsak, yine de kopyalayacak mıyız? :çok komik:

OOP'yi gerçekten sevmediğimiz için mi yoksa başka gizli sebepler var mı?

Elbette, ama başka nasıl? İyi bir programcı olarak, dinamik nesneleri yığın nesneler aracılığıyla da yönetmelisiniz (RAII tekniği)

{
   unique_ptr<Class> p( new Class);
   ...
   // ой, самоуничтожение :)
}
 
Ve kahretsin, bunun için bir sürü sarmalayıcı üreteceğiz. Çünküpolimorfizmin nişi o kadar önemli değildir, ancak OOP kullanılmıyorsa koltuk değneklerimizin geniş bir uygulama alanı vardır: ağlayın:
 
pavlick_ :

Elbette, ama başka nasıl? İyi bir programcı olarak, dinamik nesneleri yığın nesneler aracılığıyla da yönetmelisiniz (RAII tekniği)

Çöp toplayıcıdan mı bahsediyorsun? ))) veya bağlantı sayısının hesaplanması hakkında. Son zamanlarda bu çiplerle uğraştım. ancak tüm bu yaklaşımların performansı ne yazık ki µl'de yetersiz

 
Yığın nesneler aracılığıyla dinamik nesneleri yönetmek, her nesne için EK 24 bayt bellek tahsis etmek anlamına gelir (bu, böyle bir "yığın işaretçisi" + nesnenin kendisine referansın "ağırlık" alacağı kadardır). Artı hızdaki zaman maliyeti kesinlikle küçük değil. Birlikte ele alındığında, bu üzücü. Ancak buna özel bir ihtiyaç da yoktur. Korkunun büyük gözleri vardır, dedikleri gibi. Burada uzay istasyonlarını programlıyor olsaydık, elbette sıkı kontrol olmadan yapamazdık. Ve böylece, iyi işleyen bir sınıf sistemiyle, onsuz her şey yolunda gider.
 

Hayır, çöp toplayıcı hakkında değil, akıllı işaretçiler hakkında - unique_ptr, shared_ptr (referans sayımı ile), RAII'yi google'da aramak kolaydır. Genel olarak, unique_ptr için bellek açısından ek bir ödeme yoktur (sarmalayıcı == işaretçi boyutu) ve çağrılar optimize edilir, ancak µl'de her şey üzücü, evet. Ancak burada buna gerek yoktur (akıllı işaretçiler).

 
pavlick_ :

Veya şablonları alıp şöyle bir şey yazabilirsiniz:

https://www.mql5.com/ru/forum/295485/page18#comment_9971363

Düğme ayrıca herhangi bir polimorfizm ve arayüz olmadan ayrıntılara bağlı değildir. Polimorfizmin kendi nişi vardır, ancak söylediklerinden çok daha dardır.

Bu kadar basitleştirilmiş bir örnekte, elbette şablon daha uygun görünüyor. Aslında orada bir şablona bile gerek yok çünkü elinizde tek bir kopya var.

 
Alexey Navoykov :

Bu kadar basitleştirilmiş bir örnekte, elbette şablon daha uygun görünüyor. Aslında tek bir örneğiniz olduğu için orada şablona bile gerek yok.

Sanallık ile w üzerinden lamba düğmesi:

 struct SwitchableDevice {
     virtual void switchOn() = 0 ;
     virtual void switchOff() = 0 ;
};
struct Lamp : SwitchableDevice {
     void switchOn(){std::cout << "shine bright" << std::endl;}
     void switchOff(){std::cout << "i am not afraid of the dark" << std::endl;}
};
struct Button {
    SwitchableDevice& dev;
     bool state = false ;
    Button(SwitchableDevice& d) : dev(d) {}
     void buttonPress(){
         if (state) { dev.switchOff(); }
         else        { dev.switchOn();  }
        state = !state;
    }
};
int main(){
    Lamp lamp;
    Button button(lamp);
    button.buttonPress();
    button.buttonPress();
}

hileli örnekler.