2012-04-08 21 views
8

ile nasıl kaydedilmesi Sanal üye işlevlerinin aksine, her bir sınıf sınıfı türetmede uygulanan bir işlevin, temel sınıf tarafından daha sonra aramak üzere kaydedilebileceği bir çözüme ihtiyacım var. (Sadece en türetilen uygulama değil)Türetilmiş bir sınıf üyesi işlev göstergesinin bir taban sınıfı

Bunu yapmak için, türetilmiş sınıf kurucusu sırasında olduğu gibi temel sınıfla işlevlerini kaydetmek için türetilmiş sınıflar için bir mekanizma sağlamayı düşünmekteydim.

Üye işlev göstergesi bağımsız değişkeniyle sorun yaşıyorum. Derived'in Base'den türetildiğini düşünüyordum, this işaretçisinin otomatik olarak dökülmesi gerekiyor.

Bu, çalıştığım şeye yakın yapılabiliyor veya void * ve static_cast statik üye işlevlerini kullanmam gerekiyor mu?

class Base 
{ 
protected: 
    typedef void (Base::*PrepFn)(int n); 
    void registerPrepFn(PrepFn fn) {}; 
} 

class Derived : public Base 
{ 
    Derived() { 
     registerPrepFn(&Derived::derivedPrepFn); 
    }; 

    void derivedPrepFn(int n) {}; 

} 

Derleyici hatası:

error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))' 
note: candidates are:     'void Base::registerPrepFn(void (Base::*)(int))' 
+1

Tam olarak ne yapmak istediğinizden emin değilim. Ancak bu şekilde kesinlikle mümkün değil; "Türetilmiş" de tanımlanan bir üye işlevi bir "Base :: *" ile işaret edilemez. Belki de en üst düzey hedefi açıklarsanız, birileri daha iyi bir çözüm önerebilir. –

+3

FTR, 'void *' ve 'static_cast', üye işlevi için bir işaretçi bir işaretçi olmadığı için işe yaramaz (evet, korkunç adı verilir). –

+0

Statik döküm ile ilgili olarak, statik üye fonksiyonlarını uygulayabileceğimi düşünüyordum ve bu işaretçiyi açık bir şekilde iletmek için – NoahR

cevap

12

sonra yapacağız döküm: (p->*registered)(0)

See: (aslında bir Türetilmiş işaret sağlanan )

class Derived : public Base 
{ 
    Derived() { 
     registerPrepFn(static_cast<PrepFn>(&Derived::derivedPrepFn)); 
    }; 

    void derivedPrepFn(int n) {}; 

} 

bir Base* p ile normalde deyin Çalışma örneği için http://ideone.com/BB9oy.

+0

iyi, sadece hata mesajını bastırmak istemiyorum. Bu işlevsel olacak mı? – NoahR

+0

@NoahR: Evet, işe yarayacak (ancak durumun kalın yazıyla dikkat etmesini sağlayın) – jpalecek

+1

Standart, böyle bir dönüşümde şunu söylemek için şunu söylemiştir: "B sınıfı orijinal üyeyi içeriyorsa veya sınıfın bir temel veya türetilmiş sınıfıysa Orijinal üye, sonuçtaki işaretçi, üye için orijinal üyeye işaret eder. Aksi halde, dökümün sonucu tanımsızdır. " Böyle bir kadronun OP'nin en iyi istediğini yapamayacağı veya en kötü ihtimalle faydalı bir değer üretmediğinden korkuyorum. –

0

Bu OOP ile izin verilmez. Davranışsal anahtarlama, nesnenin yaratma zamanında nesnenin sınıfının polimorflanmasıyla gerçekleştirilir.

Nesne sonrası oluşturma davranışı geçişine ihtiyacınız varsa, dinamik davranışı başka bir polimorfik sınıf kümesine göre yeniden düzenleyebilir ve doğru davranışa sahip bir sınıf örneğine "işaretçi" koyabilirsiniz. Lütfen Google "dekore edilmiş sınıf" yazılım kalıbı. İhtiyacınız olan tüm hata mesajı yenerek ise

İlgili konular