2010-04-25 15 views
5

C++ ile eklentiler içeren bir programım var (dinamik lib'ler). Ana programda, bu tür bir nesne oluşturabileceğimi kontrol etmek için statik bir işlev yürütmek istiyorum.Miras sınıflarında statik bir işlevi yeniden oluşturmak için zorla

dinamik kütüphaneleri olmadan bir örneği (sorunu anlamak ettiniz değildir):

#include "libs/parent.h" 
#include "libs/one.h" 
#include "libs/two.h" 

int main(int argc, char * argv[]) 
{ 
    Parent* obj; 

    if (One::match(argv[1])) 
     obj = new One(); 
    else if (Two::match(argv[1])) 
     obj = new Two(); 
} 

Şimdi, bir arayüz sınıfı adında Ebeveyn var. Tüm eklentiler bu sınıftan miras alınır. İdeal olarak, Veli adında bir sanal statik fonksiyonum var ve tüm eklentilerin bu işlevi yeniden canlandırması gerekiyor.

Bu koddaki sorun, C++ 'da statik sanal işlev yapılamam, bu yüzden sorunu nasıl çözeceğimi bilmiyorum. Mil english için

Maalesef yaptım benim

+0

Eğer 'match()' işlevi durağan ise, 'One :: match() 'olarak adlandırmıyor olsaydınız? Neden statik olmak zorunda? –

+0

Üzgünüz, ben hata düzeltildiBu statik olmak zorundayım çünkü nesne oluşturmadan önce onu aramam gerekiyor – pacopepe222

+0

Endişeye gerek yok, sanırım saf bir sanal yöntem kullanmak sizin için işe yarar, ama bu statik değil. Yani belki de başkalarının cevapları size daha fazla yardımcı olabilir. –

cevap

5

Burada ne var fabrika desen klasik iyi. IPluginFactory adında iki yöntem - match ve create (veya isteğe bağlı olarak, her ikisini de tek bir yöntemde birleştirir) adlı bir arabirim oluşturmak istiyorsunuz. Sonra eklenti DLL'lerinin her biri bu arabirimi uygulayan bir sınıfa sahip olur.

Parent obj; 
    IPluginFactory *one = new OneFactory(); 
    IPluginFactory *two = new TwoFactory(); 

    if (one->match(argv[1])) 
     obj = one->createObj(); 
    else if (two->match(argv[1])) 
     obj = two->createObj(); 
+1

Bu cevap 'virtual static' işlevlerini ele almıyor. –

+0

Yine de soruyu ele alıyor. –

+0

Bunun statik işlevlerle nasıl bir ilişki içinde olduğunu göremiyorum. Beni aydınlatabilir misin? –

1

Eğer eklentileri her birine bir miktar static string ekleyebilir, bu kadar isim yapacağını. Veya PluginID adlı bazı yapıları yapın ve bu yapıya bu string ekleyin (ve muhtemelen başka bir eklentiye özgü bir şey).

Artık çalışma zamanında eşleştirme çok basit görünüyor. Sadece eklentinizden gelen statik tanımlama dizesinin argv'nize uyup uymadığını kontrol edin.

Bu, "kendi-ve-basit-rtti" olarak adlandırılan bir sözde yaygın olarak kullanılan bir uygulama, sorunlarınızı çözeceğini tahmin ediyor.

+0

'Eşleme' yöntemleri mutlaka basit eşitlik için kontrol etmiyor. –

+0

Bir nesne fabrikası oluşturmanın daha iyi bir çözüm olacağını kabul ediyorum, ancak sezgim aslında bu basit rtti uygulamasının bu özel durumda ne işe yaradığını söylüyor –

+0

Sorun, match() yönteminin basit karşılaştırmadan daha karmaşık olmasıdır. argv tarafından iletilen dizenin, ama teşekkür ederim! – pacopepe222

İlgili konular