2016-04-08 15 views
1

OOP'ta yeni başlayan biriyim ve kodumla zor zamanlarım var. Sorun şu ki, ben sadece bilinmeyen bir sınıfı parametre olarak göndermek istiyorum, böylece işlev içinde bir döküm yapabilir ve belirli bir sınıftan (bir parametre olarak geçirilen) bir yöntemi çağırabilirim. Bazı hileler olup olmadığını bilmek istiyorum, böylece şablonları kullanmak zorunda değilim çünkü onları çok iyi bilmiyorum. Programım, aynı ada sahip yöntemlere sahip daha fazla sınıf içeriyor, bu nedenle bu noktada sorun olmayacak. Kendimi açık seçmediysem, lütfen aşağıda bir yorum bırakın ve açıklamak için elimden geleni yapacağım. Teşekkürler!Bilinmeyen bir sınıfı parametre olarak aktarma

void myClass::myFunc(_myInstance, _myMethod,void* object) 
{ 
    ((_myInstace*)object)->_myMethod(); 
} 
+0

Eh, bu şekilde düşünmeye başladım beri, şablonları öğrenmek için çok uzun zaman olabilir. Harikalar. – DeiDei

+0

"Sizeof" veya bunun gibi şeyler kullanarak bazı küçük hile yapmak herhangi bir yolu var mı? – braga

cevap

1

Şablonlar olmadan mantıklı bir şekilde mümkün değil. Belki benzer bir etki elde etmek için biraz makro kullanabilirsiniz, ama büyük olasılıkla size tip güvenliği vermeyeceği için bunu caydıracağım.

template<typename Type> 
void func(void (Type::*method_name)(), void* object) { 
    (static_cast<Type*>(object)->*method_name)(); 
} 

ve sonra bu gibi kullanmak:

Böyle bir şey kullanmak gerekecektir

struct A { void fn() { std::cout << "Ok!"; } }; 

int main() { 
    A a; 
    void* ptr = &a; 
    func(&A::fn, ptr); 
} 

Live demo

+0

Bu şablonu "void func" için kullanabilmek için myClass tanımından önce "template " yazmam gerekiyor mu, yoksa gerekli değil mi? – braga

+0

@braga 'template ', 'fn' işlevi için bir şablon parametresi bildirdi. Bu işlev, bir şablon parametresiyle birlikte veya olmaksızın herhangi bir sınıfta kullanılabilir (örnekte olduğu gibi). Örnekte gösterildiği gibi, herhangi bir şablon parametresine sahip olmayan "A" sınıfı ile iyi çalışır. – Shoe

+0

Desteğiniz için çok teşekkürler! Bunun aradığım cevap olduğunu düşünüyorum. İyi günler! – braga

İlgili konular