Hata: Soyut Sınıf Başlatılamıyor

Hata Soyut Sinif Baslatilamiyor



Bu makale, kodumuzda soyut sınıflarla çalışırken sıklıkla meydana gelen başka bir hata hakkındadır. Nesne Yönelimli Programlamada soyut sınıflar kavramını inceleyelim. Kendisinden yaratılan herhangi bir nesneye sahip olamayan bir sınıf, soyut bir sınıf olarak bilinir. C++ Dilinde arayüz olarak da adlandırılır. Herhangi bir sınıf, içinde saf bir sanal işlev bildirerek C++ Dilinde soyut hale getirilebilir. Sanal bir fonksiyon bildirmek için fonksiyondan sonra “=0” koymalıyız. Soyut sınıf, diğer tüm alt sınıfların türetildiği bir üst veya temel sınıf görevi görür. Bu nedenle, soyut sınıfa erişmek için onu temel sınıflarından miras almalıyız. Soyut bir sınıfı başlatmaya çalıştığımızda derleme hatası alıyoruz.

Sözdizimi

Hatamızın hata mesajı aşağıdaki gibidir:

hata : '' değişkeninin '' soyut tipte olduğunu beyan edemez

Boş parantez içinde değişken ve soyut sınıf isimleri olacağına dikkat edin.







C2259 hatası : 'Durum' : soyut sınıfı başlatamaz

Böyle bir hata ile karşılaştığımızda derleyiciden aldığımız bir başka mesaj da bu.



Örnek # 01:

Bu hatayı anlaşılır kılmak için kodumuzu hata alacak şekilde yazacağımız bir örnek gerçekleştireceğiz. Bu amaçla, 'ShapeClass' adıyla bir sınıf başlattık. Bu sınıfı soyut hale getirmek için içinde “getArea” adında sanal bir fonksiyon tanımladık. Sırasıyla “setWidth” ve “setHeight” isimleriyle iki fonksiyon daha tanımladık. Burada yapmak istediğimiz, parametre olarak Yükseklik ve giriş parametresi olarak genişlik almak istiyoruz. Girdiğimiz parametrelerin yardımıyla alanı hesaplıyor olacağız. Ana yöntemde sınıfımızın bir örneğini oluşturduk. O nesnenin yardımıyla metotları çağırdık ve girdi parametrelerini o metotlar üzerinden geçireceğiz. Bundan sonra, sonuçları kontrol etmek için çıktımızı yazdırdık.



#include

ad alanı std'sini kullanma ;
sınıf
{
halka açık :
sanal int Getaria ( ) = 0 ;
geçersiz genişliği ayarla ( int içinde )
{
Genişlik = içinde ;
}
geçersiz Yüksekliği ayarla ( int h )
{
yükseklik = h ;
}
korumalı :
int Genişlik ;
int yükseklik ;
} ;
int ana ( geçersiz )
{
Şekil Sınıfı ;
Şş. genişliği ayarla ( 1 ) ;
Şş. Yüksekliği ayarla ( iki ) ;
cout << 'Toplam Dikdörtgen alanı: ' << Şş. Getaria ( ) << son ;
dönüş 0 ;
}

Kodumuzu çalıştırdıktan sonra sistem bize bir hata verdi. Hata mesajı, 'sh' değişkeninin 'shapeclass' soyut türünde olduğunu bildiremeyeceğimizi söylüyor. Şimdi, derleyici 'ShapeClass'ın soyut bir tür olduğunu ve değişkenini bildiremeyeceğimizi aktarmaya çalışıyor. Böylece, mesajla, derleyicinin soyut sınıfımızı başlatmamıza izin vermediğini, bu yüzden sistemin bize hata verdiğini açıkça anlayabiliriz.





Hatayı çözmek için başka bir sınıfı 'Dikdörtgen' ilan ettik. Bu sınıf soyut sınıfımızın alt sınıfı olacak ve sanal fonksiyonumuzun gövdesini bu sınıfta ilan edeceğiz. Daha sonra main metodunda onun nesnesini oluşturacağız ve onun nesnesi yardımıyla, fonksiyonları çağıracağız.



Değişikliklerden sonra kodumuzu yaptık ve artık kodumuzu çalıştırmayı başardık. Sistem hata vermeden kodumuzu çalıştırdı. Çıktıda sistemin bir dikdörtgenin alanını hesapladığını ve çıktısını yazdırdığını görebiliriz. Hatamızın, yanlış yaklaşım olan soyut sınıfımızın nesnesini doğrudan çağırmamız olduğunu öğrendik. Alt sınıfının nesnesini çağırdığımızda kodumuz düzgün çalışmaya başladı.

Örnek #02:

Bu örnekte herhangi bir matematiksel işlem yapmayacağız. Bu örnek, soyut sınıfları ve derleyicinin kodu yürütürken yöntemler ve sınıflar arasında nasıl çalıştığını anlamamıza yardımcı olacak genel bir örnektir. Bu sınıfta soyut bir sınıf oluşturduk ve adını “AbsClass” koyduk. Başka bir sınıfı “ChildClass” ilan ettik ama bu soyut bir sınıf değil. Bu sınıf soyut sınıfımızdan türetilmiştir.

Soyut sınıfta bildirilen bir yöntemde “Object kullanılarak değer geçirildi” yazdırdık. Fonksiyonun adı “valueFunc”. Tartıştığımız gibi, sanal işlevin gövdesi alt sınıfta bildirilir. Çocuk sınıfımızda, sanal fonksiyon gövdemize 'In virtual function' yazdırdık. Şimdi value fonksiyonumuza bir değer ileteceğiz ve ulaşılan değerin doğru olup olmadığına bakacağız. Ana yöntemimizde soyut sınıfımızın bir örneğini oluşturduk ve bu örnek yardımıyla sanal ve diğer işlevlerimizi çağıracağız. Şimdi kodumuzu çalıştıracağız.

#include

ad alanı std'sini kullanma ;
sınıf AbsClass
{
halka açık :
sanal int VirtFunc ( ) = 0 ;
geçersiz değerFunc ( int içinde )
{
Genişlik = içinde ;
cout << 'Nesne kullanılarak iletilen değer' << içinde << son ;
}
korumalı :
int Genişlik ;
} ;
sınıf Çocuk Sınıfı :
genel Abs Sınıfı
{
halka açık :
int VirtFunc ( ) {
cout << 'Sanal İşlevde' << son ;
}
} ;
int ana ( geçersiz )
{
Çocuk Sınıfı cc ;
cc. değerFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << son ;
dönüş 0 ;
}

Kodumuzun çalıştırılmasından sonra bir hata alacağız. Bu hata temel olarak, burada yapmaya çalıştığımız soyut bir sınıfı ana yöntemimizde başlatamamamızdır. Burada dikkat edilmesi gereken bir husus, mesajımızdaki değişken ve özet türünün değiştirilmiş olmasıdır.

Şimdi hatamızı kaldırmaya ve kodumuzu çalıştırmaya çalışacağız. Bu amaçla, alt sınıfımızın nesnesini oluşturacağız ve örneğini oluşturacağız. Bu örneğin yardımıyla soyut sınıfımızda hem sanal hem de başka bir yöntemi çağıracağız. Ayrıca child sınıfı kullanarak sanal fonksiyona erişip erişemeyeceğimiz de gözlemlenecektir. Bunu başarabilirsek, soyut sınıfa onun türetilmiş sınıfını kullanarak eriştiğimizi söyleyebiliriz.

Kodumuzun çalıştırılmasından sonra derleyici bu kez herhangi bir hata atmadı. Bunun yerine, sistem kodumuzu başarıyla derledi ve bize çıktı verdi. Şimdi çıktıya bir göz atalım. Sistem “Nesne kullanılarak değer geçti” ve karşısına “5” yazdırdı. Çünkü main metodundaki örneğimizi kullanarak 5'i geçtik. Ondan sonra sanal fonksiyonumuzda istediğimiz satırı yazdırdı.

Çözüm

Bu kılavuzda, programcıların nesne yönelimli kavramları kodlarken ve uygularken karşılaştıkları kritik hataları ele aldık. Bu tür hatalar genellikle bir programcı soyut sınıflarla uğraşırken ortaya çıkar. Makalenin tamamı, soyut sınıfların somutlaştırılamayacağını ve nesnelerinin içindeki yöntemleri çağırmalarını sağlayamayacağımızı özetlemektedir. Hata oluşturmak için farklı örnekler de denedik ve ardından kodumuzdaki hataları çözdük.