2011-01-12 15 views
9

Bir projede "devingen" olarak uygulanan "özel miras" kullanıyorum. Temel sınıf, operatör [] 'i tanımlar ve kullanmak istediğim işlev budur. Bu nedenle, operatörün hangi sürümünün [] aldığını nasıl kontrol edebilirim? Aslında, birden fazla, hem de const ve const sürümlerine ihtiyacım var. Bu başarılabilir mi?Yönerge, aşırı yüklenmeler kullanarak özel miras mı?

+3

Bu durumda, özel miras yerine istediğiniz sonucu vermek için kompozisyon kullanabilirsiniz. – James

+1

Evet, biliyorum ... Yönlendirme kodunun miktarını azaltmak yerine onu özel mirasa dönüştürdüm. Yani bu mümkün değil mi? Fonksiyon nasıl seçilir? – carlpett

+0

Burada özel bir miras yerine kompozisyon kullanıyorsanız, kodunuzun yazılması ve bakımı daha kolay olacaktır. Başparmak kuralı, kesinlikle gerekli olmadıkları zaman, C++ 'nın duvar dışı özelliklerini kullanmamaktır (şimdiye kadar söylediklerinizden, bu durumda özel mirasa gerek yoktur). –

cevap

6

Anlayışım, using ürününüzün, operatörün tüm farklı aşırı yüklenmelerini otomatik olarak getirmesidir. Çocuk sınıfına getirilmekten kaçınmak istediğiniz bazı aşırı yüklenmeler var mı? Bu durumda, işi ebeveynde birkaç farklı isimlendirilmiş fonksiyona bölmek ve ihtiyacınız olan sadece using olmak daha iyi olabilir.

+0

Ben de öyle düşünmüştüm, ama hem T hem de T yapısını döndüren versiyonlar olmasına rağmen derleme hatalarından derleme hataları alıyorum T ('' tip typename T) – carlpett

+0

Yani, bu onlardan biri 'sihirli olarak kendini kurtardı "times ... Kodları inceledikten ve yeniden derledikten sonra, aniden çalışır ve hayatımın değişmesi için ne değiştirdiğimi anlayamıyorum. Değişim ne oldu da miras hakkında biraz daha fazla şey öğrendim, teşekkürler! – carlpett

2

Bu beklendiği gibi yapar: Başka bir deyişle

class A 
{ 
public: 
    int operator[](int idx) { return 0; } 
    int operator[](int idx) const { return 1; } 
}; 

class B : public A 
{ 
public: 
    using A::operator[]; 

    void opa() { cout << operator[](1) << endl; } 
    void opb() const { cout << operator[](1) << endl; } 
}; 

int main(void) 
{ 
    B b; 
    b.opa(); 
    b.opb(); 

    const B d = B(); 
    cout << d[1] << endl; // should trigger the const version of operator[] 
    return 0; 
} 

uygun const/olmayan const versiyonları B içine enjekte edilir. Not: const sürümü sağlanmazsa, bir derleyici hatası alırsınız (bu, mirasın özel mi yoksa genel mi olduğunu belirler).

+0

Teşekkürler, iyi örnek! – carlpett

+0

Ayrıca, operatör fonksiyonlarının doğrudan B sınıfı sınıfından kullanılabildiğini göstermek için 'b [2]; – aschepler

+0

@aschepler, iyi nokta, güncellenecek ... – Nim

İlgili konular