Ralat: Tidak Dapat Menghidupkan Kelas Abstrak

Ralat Tidak Dapat Menghidupkan Kelas Abstrak



Artikel ini adalah mengenai ralat lain yang sering berlaku apabila kami bekerja dengan kelas abstrak dalam kod kami. Marilah kita mengkaji konsep kelas abstrak dalam Pengaturcaraan Berorientasikan Objek. Kelas yang tidak boleh mempunyai sebarang objek yang dicipta daripada dirinya sendiri dikenali sebagai kelas abstrak. Ia juga dipanggil antara muka dalam Bahasa C++. Mana-mana kelas boleh dibuat abstrak dalam Bahasa C++ dengan mengisytiharkan fungsi maya tulen di dalamnya. Untuk mengisytiharkan fungsi maya, kita perlu meletakkan “=0” selepas fungsi tersebut. Kelas abstrak bertindak sebagai induk atau kelas asas dari mana semua kelas kanak-kanak lain diperolehi. Jadi, untuk mengakses kelas abstrak, kita perlu mewarisinya daripada kelas asasnya. Apabila kami cuba membuat instantiate kelas abstrak, kami mendapat ralat kompilasi.

Sintaks

Mesej ralat ralat kami adalah seperti berikut:

ralat : tidak boleh mengisytiharkan pembolehubah ' ' sebagai jenis abstrak ''

Ambil perhatian bahawa dalam kurungan kosong, akan ada nama kelas berubah dan abstrak.







ralat C2259 : 'Negeri' : tidak boleh membuat instantiate kelas abstrak

Ini adalah satu lagi mesej yang kami dapat daripada pengkompil apabila kami menghadapi ralat sedemikian.



Contoh # 01:

Untuk membuat ralat ini dapat difahami, kami akan melaksanakan contoh di mana kami akan menulis kod kami sedemikian rupa sehingga kami mendapat ralat. Untuk tujuan itu, kami telah memulakan kelas dengan nama 'ShapeClass'. Untuk menjadikan kelas ini abstrak, kami telah mengisytiharkan fungsi maya di dalamnya dengan nama 'getArea'. Kami telah mengisytiharkan dua fungsi lain juga dengan nama 'setWidth' dan 'setHeight' masing-masing. Apa yang ingin kami lakukan di sini ialah kami ingin mendapatkan Ketinggian sebagai parameter dan lebar sebagai parameter input. Kami akan mengira kawasan dengan bantuan parameter input kami. Kami membuat tika kelas kami dalam kaedah utama. Dengan bantuan objek itu, kami telah memanggil kaedah dan kami akan lulus parameter input melalui kaedah itu. Selepas itu, kami mencetak output kami untuk menyemak keputusan.



#include

menggunakan ruang nama std ;
kelas ShapeClass
{
awam :
maya int Getaria ( ) = 0 ;
batal setWidth ( int dalam )
{
lebar = dalam ;
}
batal setHeight ( int h )
{
ketinggian = h ;
}
dilindungi :
int lebar ;
int ketinggian ;
} ;
int utama ( batal )
{
ShapeClasssh ;
sh. setWidth ( 1 ) ;
sh. setHeight ( dua ) ;
cout << 'Jumlah luas segi empat tepat: ' << sh. Getaria ( ) << endl ;
kembali 0 ;
}

Sistem memberi kami ralat selepas pelaksanaan kod kami. Mesej ralat mengatakan bahawa kami tidak boleh mengisytiharkan pembolehubah 'sh' sebagai 'shapeclass' jenis abstrak. Sekarang, pengkompil cuba menyampaikan bahawa 'ShapeClass' ialah jenis abstrak dan kami tidak boleh mengisytiharkan pembolehubahnya. Oleh itu, dengan mesej itu, kami dapat memahami dengan jelas bahawa pengkompil tidak membenarkan kami membuat kelas abstrak kami, itulah sebabnya sistem memberi kami ralat.





Untuk menyelesaikan ralat, kami mengisytiharkan kelas lain 'Rectangle'. Kelas ini akan menjadi kelas kanak-kanak kelas abstrak kami dan kami akan mengisytiharkan badan fungsi maya kami dalam kelas ini. Selepas itu, kami akan mencipta objeknya dalam kaedah utama dan dengan bantuan objeknya, kami akan memanggil fungsi.



Selepas pindaan, kami membuat kod kami dan kini kami telah berjaya menjalankan kod kami. Sistem telah melaksanakan kod kami tanpa memberikan ralat. Kita boleh melihat dalam output bahawa sistem telah mengira luas segi empat tepat dan mencetak output. Kami telah mengetahui bahawa kesilapan kami ialah kami secara langsung memanggil objek kelas abstrak kami yang merupakan pendekatan yang salah. Apabila kami memanggil objek kelas anaknya kod kami mula berfungsi dengan baik.

Contoh # 02:

Dalam contoh ini, kita tidak akan melakukan sebarang pengiraan matematik. Contoh ini ialah contoh generik yang akan membantu kita memahami kelas abstrak dan cara pengkompil berjalan antara kaedah dan kelas semasa melaksanakan kod. Dalam kelas ini, kami telah mencipta kelas abstrak dan menamakannya 'AbsClass'. Kami telah mengisytiharkan kelas lain 'ChildClass' tetapi yang ini bukan kelas abstrak. Kelas ini diperoleh daripada kelas abstrak kami.

Kami telah mencetak 'Nilai diluluskan menggunakan Objek' dalam kaedah yang diisytiharkan dalam kelas abstrak. Nama fungsi ialah 'valueFunc'. Seperti yang kita bincangkan, badan fungsi maya diisytiharkan dalam kelas kanak-kanak. Dalam kelas anak kami, kami telah mencetak 'Dalam fungsi maya' dalam badan fungsi maya kami. Sekarang, kami akan menghantar nilai kepada fungsi nilai kami dan melihat sama ada nilai yang dicapai adalah betul. Dalam kaedah utama kami, kami telah mencipta contoh kelas abstrak kami dan dengan bantuan contoh itu, kami akan memanggil fungsi maya dan fungsi lain kami. Sekarang, kami akan melaksanakan kod kami.

#include

menggunakan ruang nama std ;
kelas AbsClass
{
awam :
maya int VirtFunc ( ) = 0 ;
batal valueFunc ( int dalam )
{
lebar = dalam ;
cout << 'Nilai diluluskan menggunakan Objek' << dalam << endl ;
}
dilindungi :
int lebar ;
} ;
kelas ChildClass :
AbsClass awam
{
awam :
int VirtFunc ( ) {
cout << 'Dalam Fungsi Maya' << endl ;
}
} ;
int utama ( batal )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
kembali 0 ;
}

Selepas pelaksanaan kod kami, kami akan mendapat ralat. Ralat ini pada asasnya ialah kita tidak boleh membuat instantiate kelas abstrak yang kita cuba lakukan di sini dalam kaedah utama kita. Satu perkara yang perlu diperhatikan di sini ialah jenis pembolehubah dan abstrak dalam mesej kami telah diubah.

Sekarang, kami akan cuba mengalih keluar ralat kami dan melaksanakan kod kami. Untuk tujuan itu, kami akan mencipta objek kelas anak kami dan membuat contohnya. Dengan bantuan contoh itu, kami akan memanggil kedua-dua kaedah maya dan kaedah lain dalam kelas abstrak kami. Ia juga akan diperhatikan sama ada kita boleh mengakses fungsi maya menggunakan kelas kanak-kanak atau tidak. Jika kita berjaya berbuat demikian, kita boleh mengatakan bahawa kita telah mengakses kelas abstrak menggunakan kelas terbitannya.

Selepas pelaksanaan kod kami, pengkompil tidak membuang sebarang ralat kali ini. Sebaliknya, sistem telah berjaya menyusun kod kami dan memberikan kami output. Sekarang, mari kita lihat outputnya. Sistem telah mencetak 'Nilai diluluskan menggunakan Objek' dan '5' padanya. Kerana kami melepasi 5 menggunakan contoh kami dalam kaedah utama. Selepas itu, ia mencetak baris yang kami minta dalam fungsi maya kami.

Kesimpulan

Dalam panduan ini, kami membincangkan ralat kritikal yang dihadapi oleh pengaturcara semasa mengekod dan mempraktikkan konsep berorientasikan objek. Jenis ralat ini sering berlaku apabila pengaturcara berurusan dengan kelas abstrak. Keseluruhan artikel meringkaskan bahawa kelas abstrak tidak boleh dijadikan instantiated, dan kita tidak boleh membuat kaedah panggilan objek mereka di dalamnya. Kami juga mencuba contoh yang berbeza untuk mencipta ralat dan kemudian menyelesaikan ralat dalam kod kami.