Varsayılan bir kurucu veya kopya yapımcısı bulunmayan, elmas şeklinde bir sınıf hiyerarşisi var. Ben iki kurucular bir "hareket" bir ve bir nesneye bir lvalue başvurusu alır başka: elmas biçimli hiyerarşi kullanmayan yanındaElmas şeklindeki bir miras için bir hareket yapıcısı nasıl uygulanır?
struct base {
base(base&&) = default;
base(member_type&& m): member_(std::move(m)) {}
member_type member_;
};
struct virt_1: virtual base {
virt_1(virt_1&& rhs): base(std::move(rhs)) {}
virt_1(member_type&& m): base(std::move(m)) {}
};
struct virt_2: virtual base {
virt_2(virt_2&& rhs): base(std::move(rhs)) {}
virt_2(member_type&& m): base(std::move(m)) {}
};
struct concrete: virt_1, virt_2 {
concrete(concrete&& rhs) // ???
};
, somut sınıf için hamle yapıcı uygulamak mümkündür ?
Teşekkürler!
Sesler bana çok eğilimli geliyor. Sanal tabanın kurucusu, en türetilmiş sınıftan çağrılır ve bir hareket ettiriciyi aramadığı için hiçbir sebep olmamalıdır. Ama herhangi bir başka türetme, ve birisinin onu unutacağı ya da yanlış yaptığı iyi bir şans var. Genel bir kural olarak, sanal temel sınıfları bu tür sorunları önlemek için veri içermemeli veya en azından varsayılan kurucudan başka kurucular içermemelidir. –
@JamesKanze "base" in veri içermemesi veya en azından varsayılan bir kurucu içermesi gerektiğinin farkındayım, ancak bağlamımda durum böyle olamaz. Ancak, bir kişi, daha fazla türetirken sanal taban yapıcısını çağırmayı unutursa, derleyicinin şikayet edeceği ihtimali var mıdır? base' hiçbir varsayılan kurucu vardır, bu yüzden en türetilmiş tip ** zorunluluk ** Ben elmas şekli mümkündür "kırılma" itiraf etmeliyim açıkça – piwi
@piwi, hayır, hiç şans yok ama çok fazla iş gerektirecek. İnsanlar daha önce anlamadığım/anlamadığı başlatıcılara yapılan çağrıların "faydasızlığı" ile ilgili olarak işaret ettikleri gibi, bu hiyerarşiden kaçınmanın bu çözümünü umuyoruz: -/Teşekkürler –