2011-04-16 26 views
5

Aşağıdaki örnekte, temelin, örnekleme sırasında bir tür geçirilen sürücü olduğu bir sürücü tipi sınıfı oluşturmaya çalışılıyor. Bu durumda, tip 2, doğru türetilmiş nesneyi oluşturmak için kullanılır.Temel sınıftan türetilen nesnelere örnekleme

Derleyicim, "Class Base" satırında bir Declaration sözdizimi hatası veriyor. Aşağıda

class Base 
{ 
public: 

    Base(int h); 
    virtual ~Base(); 

private: 
    int hType; 
    Base *hHandle; 
}; 


class Derived1 : public Base 
{ 
public: 
    Derived1(); 
    virtual ~Derived1(); 

}; 

class Derived2 : public Base 
{ 
public: 
    Derived2(); 
    virtual ~Derived2(); 

}; 

Base::Base(int h) 
{ 
    hType = h; 

    switch(h) 
    { 
     case 1: 
      hHandle = new Derived1; 
     break; 

     case 2: 
      hHandle = new Derived2; 
     break; 

    } 
} 


Derived1::Derived1():Base(1) 
{ 
    printf("\nDerived1 Initialized\n\n"); 
} 

Derived2::Derived2():Base(2) 
{ 
    printf("\nDerived2 Initialized\n\n"); 
} 

tam kaynağını göstermek için kod güncellenir ... İşte
Base *B; 

    B = new Base(2); 
    if(B) 
    { 
     B->DoStuff(); 
     B->DoMoreStuff(); 
     delete B; 
    } 

derlemek olmaz benim kodudur:

Benim nihai hedef bunu yapabilmek olmaktır . Sanırım şimdi neden derlenmeyeceğini anlıyorum. Aşağıda belirtildiği üzere, ben

#include <stdio.h> 

class Base 
{ 
public: 

    Base(); 
    Base(int h); 
    Create (int h); 
    virtual ~Base(); 

private: 
    int hType; 
    Base *hHandle; 
}; 


class Derived1 : public Base 
{ 
public: 
    Derived1(); 
    virtual ~Derived1(); 

}; 

class Derived2 : public Base 
{ 
public: 
    Derived2(); 
    virtual ~Derived2(); 

}; 

Base::Base() 
{ 

} 

Base::Base(int h) 
{ 
    Create(h); 
} 

Base::Create(int h) 
{ 
    hType = h; 

    switch(h) 
    { 
     case 1: 
      hHandle = new Derived1; 
     break; 

     case 2: 
      hHandle = new Derived2; 
     break; 

    } 
} 

Derived1::Derived1() 
{ 
    printf("\nDerived1 Initialized\n\n"); 
} 

Derived2::Derived2() 
{ 
    printf("\nDerived2 Initialized\n\n"); 
} 
+0

Hata metni nedir? Kod snippet'inizin ilk satırına atıfta bulunuyorsa, bu * yanlış * görünmez. – ssube

+2

Çalışma zamanı nedir? Bir Temel (1) oluşturduğunuzda, kurucu, temel sınıfını çağıran yeni bir Türetilmiş oluşturur, Base (1), temel sınıfını çağıran yeni bir Türetilmiş oluşturur. –

+0

@Eric: lütfen ya std'yi kullanın :: unique_ptr', boost :: scoped_ptr' veya 'std :: auto_ptr' (ikincisi daha kötüsüdür). Oyuncak örneğinizde bir bellek sızıntınız var:/ –

cevap

2

Bir class factory yapmaya çalışıyoruz gibi görünüyor 'yeni' çağrı sonsuz bir döngüye sahiptir.

Base'de, Derived1 veya Derived2 döndüren statik bir yönteminizin olmasını öneririm.

class Base 
{ 
public: 
    static Base* Create(int); 
    virtual void DoStuff() = 0; 
} 

class Derived1 : public Base 
{ 
    Derived1() 
    { 
     printf("\nDerived1 Initialized\n\n"); 
    } 

    virtual void DoStuff() 
    { 
    } 
} 

class Derived2 : public Base 
{ 
    Derived2() 
    { 
     printf("\nDerived2 Initialized\n\n"); 
    } 

    virtual void DoStuff() 
    { 
    } 
} 

Base* Base::Create(int n) 
{ 
    if (n==1) 
     return new Derived1(); 
    else if (n==2) 
     return new Derived2(); 
    else 
     return nullptr; 
} 

void main() 
{ 
    Base* B = Base::Create(2); 
    if(B) 
    { 
     B->DoStuff(); 
     delete B; 
    } 
} 
+0

Bu ilginç, bunu okuyabiliyorum/anlayabiliyorum ama hala kodumun neden derlenmeyeceği konusunda kafamı çiziyorum? Bu sonuçta soruma cevap vermiyor. Arayanın Base :: Create'in ayrıntılarını bilmesini istemiyorum. Arayan kişinin mümkün olduğunda yeni Base (tip) çağırmasını isterim? – Eric

+0

İlk olarak, kodunuz, bildirmediği işlevleri çağırmaya çalışıyorsa, hHandle'daki meslektaşlarını çağıran proxy yöntemlerini yapmanız gerekir. İkincisi ve en önemlisi, derleyici tarafından yakalanmayacak şekilde, Türetilmiş1'in oluşturulması, sonsuz bir döngüde Derived1'in başka bir örneğini oluşturmak için Temel kurucuyu çağırır. –

+0

Son yorumun ilk bölümünü yoksayın ... Sınıf Tabanı bir sözdizimi hatası içeriyorsa, büyük olasılıkla üst üste bir noktalı virgül olması olasıdır. Bu çizgide yanlış bir şey göremiyorum. Tam hatayı derleyiciden ayırabilir misiniz? –

İlgili konular