2016-04-14 17 views
1

Hem sınıf hem de bu sınıftaki bir yöntemin adını alan bir şablon sınıfı yazıyorum. Bunu yapmak zorundayım çünkü şablonumu başlatmak için kullanacağım çeşitli sınıflar, yöntemin adının sınıftan sınıfa değiştiği ortak bir imzayla benzer yöntemlere sahip. Bazı durumlarda söz konusu yöntem özeldir. Bu nedenle, şablonumun özel yönteme erişimini sağlayan bir arkadaş beyanı ile bu tür sınıfları arttırmak istiyorum.Arkadaş canlısı şablonum, kendi özel üyemden kendi ifadesinden bahsedebilir mi?

template<class T, int (T::*func)()> 
class A { 
    public: 
    int count(T* p) { return (p->*func)(); } 
}; 

class B { 
    public: 
    int funcPublic() { return 0; } 
}; 

class C { 
    template<class T, int (T::*)()> friend class A; 
    private: 
    int funcPrivate() { return 0; } 
}; 

typedef A<B, &B::funcPublic > AB; // works 
typedef A<C, &C::funcPrivate> AC; // g++: "error: ‘int C::funcPrivate()’ is private" 

Erişim kontrolü oldukça kullanım noktasında daha söz noktasına (yani şablon örneği) kontrol edilmesi gereken noktalar görünüyor. C++ nasıl belirtilir? Ben sadece şanstan muyum? Eğer sınıf C değiştirebilirsiniz Eğer

+0

İlgili (ancak üye işlevine değil, gösterici-üye değişkenini kullanarak): http://stackoverflow.com/a/3173080/103167 –

+2

Tüm bu sınıfların bir arkadaşını A yapmak için can atıyorsunuz ama sen 'A' için çağırmak için ortak bir arayüz uygulamak için istekli değilsin? Garip bir gereksinim gibi görünüyor ... Ne yapmaya çalıştığınızı açıklarsanız, bazı yararlı geri bildirimler alabilirsiniz. – Nemo

+0

@BenVoigt: Kod yazmam gerektiği noktada, tasarımımın yanlış olduğunu farz ediyorum. – Nemo

cevap

2

, aşağıdaki gibi bunun geçici bir çözüm gibi görünüyor: Bu yaklaşımla

class C 
{ 
private: 
    int funcPrivate() { return 0; } 

public: 
    typedef A<C, &C::funcPrivate> value; 
}; 

typedef C::value AC; 

, gerçekten de friend böyle sınıfları genişletmek için gerekmez. Ancak, bu yaklaşım gereksiniminizi karşılarsa, lütfen yöntemi çağırmak için uygun bir arabirim sağlamayı düşünün.

+0

Teşekkürler @DeanSeo. Bu sadece ihtiyacım olan yönlendirme oldu. Net etki şu an takip ettiğim yaklaşımdan çok daha iyi bir şekilde kapsüllenmiş durumda. –

+0

@JohnYates Yardım ettiğine sevindim. Barış. –

İlgili konular