C++ pogreška: nema održivog preopterećenja '=':

C Pogreska Nema Odrzivog Preopterecenja



Pogreške su operacije koje mogu biti rezultat nepravilnog rada bilo kojeg koda. Pogreška se ne može otkriti u vrijeme pisanja dok ne izvršimo kod ili dok se ne prevede. Neke pogreške onemogućuju izvršavanje koda dok se ne uklone. Danas ćemo također raspravljati o pogrešci koja se također pojavljuje kada se program kompajlira, a to je 'greška: nema podudaranja za 'operator=''. Ova pogreška može biti uzrokovana razlozima kao što su: ako smo proslijedili pokazivač gdje se niz treba proslijediti, modificiranje konstantne varijable, itd. Nije teško ukloniti pogrešku 'no viable overloaded', ali glavni zadatak je razumjeti pogrešku jer samo prikazuje pogrešku bez ikakvog opisa pogreške.

Sintaksa

Ne postoji takva unaprijed definirana sintaksa za ovu pogrešku jer ona nije dio koda ili izlaza, to je samo dvosmislenost koja može biti uzrokovana krivim kodom. Kao što vidimo, dolje je primjer kako greška može izgledati.







greška : nema podudaranja za 'operater = '

Primjer # 01:

Zamislimo se o ovoj pogrešci i metodi za njezino rješavanje. Da bismo to bolje razumjeli, izvest ćemo primjer u kojem ćemo funkciji proslijediti imena pomoću objekata, a ona će ih zatim prikazati. Prvo ćemo uključiti datoteku zaglavlja iostream. Nakon toga ćemo deklarirati klasu pod nazivom “my_object”. Unutar kojih smo deklarirali dvije string varijable pod nazivom “F_name i “L_name”, “F_name” koja označava ime osobe gdje “L_name” označava prezime osobe.



Zatim smo deklarirali javni konstruktor pod nazivom “my_object()” u kojem smo dodijelili null vrijednosti objema varijablama “F_name” i “L_name”. Nakon toga smo deklarirali još jednu funkciju kojoj smo proslijedili varijable tipa string “fn” i “ln”. Unutar toga pozvali smo metodu name_set(). Zatim smo deklarirali dvije funkcije članice “show()” i “name_set()”. Kada se pozove funkcija “show(), ona će prikazati imena i prezimena zajedno. Dok smo u funkciji članu “set_name()” proslijedili dvije string varijable tipa string “fn” i “ln” koje smo također proslijedili drugom konstruktoru.



Sada, koristeći operator dodjele kopiranja klase my_object, uzimamo jedan parametar tipa “my_object”. Prevodilac ga uvijek deklarira kao inline javni član bilo koje klase. Unutar ovog člana, dodijelili smo src.F_name “F_name” i src.L_name “L_name” da smo zadržali kopiju “F_name” i “L_name”. Ovo se prosljeđuje članovima klase my_object. Sada smo deklarirali objekt klase my_cobject pod nazivom “name1” kojemu smo proslijedili dva niza “Anna” i “smith” kao argument. Ovo će pozvati konstruktor i prikazati ime zajedno s prezimenom.





Nakon toga, kreirali smo još jedan objekt “name2” i zatim zasebno dodijelili ime tom objektu. Nakon prosljeđivanja vrijednosti konstruktoru za oba objekta, pozvali smo metodu show() koja će zatim prikazati imena za oba objekta 'nam1' i 'name2'. Na kraju koda, vratili smo null vrijednost i izvršili naš kod.

uključiti
razreda moj_objekt {
privatni :
std :: niz F_ime, L_ime ;
javnost :
moj_objekt ( ) { F_name = ' ' ; L_ime = ' ' ; }
moj_objekt ( std :: niz fn, std :: niz ul ) {
naziv_skup ( fn, ln ) ;
}
poništiti pokazati ( ) { std :: cout << 'Ime je' << F_name << ' ' << L_ime << '. \n ' ; }
poništiti naziv_skup ( std :: niz fn, std :: niz ul ) { F_name = fn ; L_ime = ul ; }
moj_objekt i operater = ( konst moj_objekt i src ) {
F_name = src F_name ;
L_ime = src L_ime ;
povratak * ovaj ;
}

} ;
int glavni ( int argc, char ** argv ) {
naziv mog_objekta1 ( 'Anna' , 'kovač' ) ;
naziv mog_objekta2 ;
ime2 = ( 'Anna' , 'kovač' ) ;
ime1. pokazati ( ) ;
ime2. pokazati ( ) ;
povratak 0 ;
}

Nakon izvršenja našeg koda, imamo ovu pogrešku koja prikazuje da smo napisali pogrešan kod u retku 24 koji označava vrstu greške na koju se nailazi 'greška: nema podudaranja za 'operator=''. Sada ćemo pokušati riješiti ovu grešku.



Za rješavanje ove pogreške imamo više načina za prosljeđivanje vrijednosti konstruktoru bilo koje klase. U prvoj metodi jednostavno ćemo dodijeliti objekt “name1” objektu “name2” jer smo proslijedili iste vrijednosti oba objekta tako da nema potrebe da ih prosljeđujete zasebno. Sada izvršavamo kod.

int glavni ( int argc, char ** argv ) {

naziv mog_objekta1 ( 'Anna' , 'kovač' ) ;
naziv mog_objekta2 ;
ime2 = ime1 ;
ime1. pokazati ( ) ;
ime2. pokazati ( ) ;

Nakon izmjena koda kao što je gore prikazano, imamo rezultat dat u isječku u nastavku. Prikazali smo ime koje je proslijeđeno konstruktoru uspješno prikazano bez greške.

Druga metoda za rješavanje ove pogreške je kada moramo proslijediti različite vrijednosti u oba objekta. Jednostavno ćemo koristiti naziv klase zajedno s vrijednostima koje treba proslijediti konstruktoru kao argument. Prošli smo prvo ime 'jhone' i drugo ime 'smith'. Zatim smo izvršili kod.

int glavni ( int argc, char ** argv ) {

naziv mog_objekta1 ( 'Anna' , 'kovač' ) ;
naziv mog_objekta2 ;
ime2 = moj_objekt ( 'ivan', 'kovač' ) ;

ime1. pokazati ( ) ;
ime2. pokazati ( ) ;

Nakon izvršavanja gore dodanog koda, imamo izlaz kao što je prikazano u nastavku. Za objekt 'name1' prikazao je ime 'Anna smith', a za drugi objekt 'name2' prikazao je 'Jhone Smith'. Ali ovaj put je naš kod ispravno radio bez ikakvih grešaka.

Sada ćemo isprobati drugu metodu za uspješno izvršavanje našeg koda. Kao iu prethodnim slučajevima, pokušali smo dodijeliti vrijednosti objektima pomoću operatora dodjele. Ali ovaj put ćemo proslijediti vrijednosti u vrijeme deklaracije objekta. Kao što možemo vidjeti u isječku ispod, u vrijeme deklaracije objekta “name1”, proslijedili smo vrijednosti kao argument objektu ponavljajući isti korak za “name2”. Sada još jednom izvršavamo kod.

int glavni ( int argc, char ** argv ) {
naziv mog_objekta1 ( 'Anna' , 'kovač' ) ;
naziv mog_objekta2 ( 'ivan', 'kovač' ) ;
ime1. pokazati ( ) ;
ime2. pokazati ( ) ;

Nakon što se kôd izvrši i ovo vrijeme, nismo naišli ni na jednu pogrešku što znači da će nas to također spriječiti da imamo pogreške.

Zaključak

Ukratko smo raspravljali o pogrešci s kojom se možemo suočiti dok radimo na funkcijama kojima se pristupa iz klasa. Također smo proučili uzroke i metode za rješavanje pogreške 'no viable overloaded'. Uglavnom je ovu pogrešku teško razumjeti novim programerima pa smo im pokušali olakšati da je se riješe implementacijom primjera i njezinim objašnjenjem.