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");
}
Hata metni nedir? Kod snippet'inizin ilk satırına atıfta bulunuyorsa, bu * yanlış * görünmez. – ssube
Ç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. –
@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:/ –