Chyba C++: Žiadne životaschopné preťaženie „=“:

Chyba C Ziadne Zivotaschopne Pretazenie



Chyby sú operácie, ktoré môžu byť výsledkom abnormálneho fungovania akéhokoľvek kódu. Chybu nie je možné zistiť v čase písania, kým nespustíme kód alebo kým nie je skompilovaný. Niektoré chyby zabraňujú spusteniu kódu, kým nie sú odstránené. Dnes budeme diskutovať aj o chybe, ktorá sa vyskytuje aj pri kompilácii programu, a to „chyba: žiadna zhoda pre „operátor=“. Táto chyba môže byť spôsobená z dôvodov, ako sú: ak sme prešli ukazovateľ, kam má byť reťazec odovzdaný, modifikácia konštantnej premennej atď. Nie je ťažké odstrániť chybu „žiadne životaschopné preťaženie“, ale hlavnou úlohou je porozumieť chybe, pretože iba zobrazuje chybu bez akéhokoľvek popisu chyby.

Syntax

Pre túto chybu neexistuje žiadna takáto preddefinovaná syntax, pretože nie je súčasťou kódu alebo výstupu, je to len nejednoznačnosť, ktorá môže byť spôsobená nesprávnym kódom. Ako vidíme, nižšie je príklad toho, ako môže chyba vyzerať.







chyba : žiadna zhoda pre ‘operátor = '

Príklad č. 01:

Poďme si predstaviť túto chybu a spôsob, ako ju vyriešiť. Aby sme to lepšie pochopili, uvedieme príklad, v ktorom funkcii odovzdáme názvy pomocou objektov a tá ich následne zobrazí. Najprv zahrnieme hlavičkový súbor iostream. Potom deklarujeme triedu s názvom „my_object“. Vo vnútri ktorých sme deklarovali dve reťazcové premenné s názvom „F_name a „L_name“, „F_name“, ktoré označuje krstné meno osoby, pričom „L_name“ označuje priezvisko osoby.



Ďalej sme deklarovali verejný konštruktor s názvom „my_object()“, v ktorom sme priradili nulové hodnoty premenným „F_name“ a „L_name“. Potom sme deklarovali ďalšiu funkciu, ktorej sme odovzdali premenné typu reťazec „fn“ a „ln“. Vo vnútri sme zavolali metódu name_set(). Potom sme deklarovali dve členské funkcie „show()“ a „name_set()“. Keď sa zavolá funkcia „show(), zobrazí sa krstné mená a priezviská spolu. Zatiaľ čo v členskej funkcii „set_name()“ sme odovzdali dve reťazcové premenné typu reťazec „fn“ a „ln“, ktoré sme odovzdali aj druhému konštruktorovi.



Teraz pomocou operátora priradenia kopírovania triedy my_object vezmeme jeden parameter typu „my_object“. Kompilátor ho vždy deklaruje ako inline verejný člen akejkoľvek triedy. V rámci tohto člena sme priradili src.F_name k „F_name“ a src.L_name k „L_name“, pričom sme zachovali kópiu „F_name“ a „L_name“. Toto sa odovzdá členom triedy my_object. Teraz sme deklarovali objekt triedy my_cobject s názvom „name1“, ktorému sme ako argument odovzdali dva reťazce „Anna“ a „smith“. Toto zavolá konštruktor a zobrazí krstné meno spolu s priezviskom.





Potom sme vytvorili ďalší objekt „name2“ a potom sme tomuto objektu priradili názov samostatne. Po odovzdaní hodnôt do konštruktora pre oba objekty sme zavolali metódu show(), ktorá potom zobrazí názvy pre oba objekty „nam1“ a „name2“. Na konci kódu sme vrátili hodnotu null a vykonali náš kód.

zahŕňajú
trieda môj_objekt {
súkromné :
std :: reťazec F_name, L_name ;
verejnosti :
môj_objekt ( ) { F_name = '' ; L_name = '' ; }
môj_objekt ( std :: reťazec fn, std :: reťazec ln ) {
name_set ( fn, ln ) ;
}
neplatné šou ( ) { std :: cout << 'meno je' << F_name << '' << L_name << '. \n ' ; }
neplatné name_set ( std :: reťazec fn, std :: reťazec ln ) { F_name = fn ; L_name = ln ; }
môj_objekt & operátor = ( konšt môj_objekt & src ) {
F_name = src. F_name ;
L_name = src. L_name ;
vrátiť * toto ;
}

} ;
int hlavné ( int argc, char ** argv ) {
môj_názov_objektu1 ( 'Anna' , 'kováč' ) ;
môj_názov_objektu2 ;
meno2 = ( 'Anna' , 'kováč' ) ;
meno1. šou ( ) ;
meno2. šou ( ) ;
vrátiť 0 ;
}

Po vykonaní nášho kódu máme túto chybu, ktorá zobrazuje, že sme napísali nesprávny kód na riadok 24 označujúci typ chyby, ktorá sa vyskytla „chyba: žiadna zhoda pre „operátor=“. Teraz sa pokúsime túto chybu vyriešiť.



Na vyriešenie tejto chyby máme viacero spôsobov, ako odovzdať hodnoty konštruktorovi ľubovoľnej triedy. V prvej metóde jednoducho priradíme objekt „name1“ objektu „name2“, pretože sme obom objektom odovzdali rovnaké hodnoty, takže ich nie je potrebné odovzdávať oddelene. Teraz spustíme kód.

int hlavné ( int argc, char ** argv ) {

môj_názov_objektu1 ( 'Anna' , 'kováč' ) ;
môj_názov_objektu2 ;
meno2 = meno1 ;
meno1. šou ( ) ;
meno2. šou ( ) ;

Po vykonaní zmien v kóde, ako je uvedené vyššie, máme výsledok uvedený v úryvku nižšie. Zobrazili sme, že názov odovzdaný konštruktorovi sa zobrazuje úspešne bez akejkoľvek chyby.

Druhá metóda na vyriešenie tejto chyby je, keď musíme obom objektom odovzdať rôzne hodnoty. Ako argument jednoducho použijeme názov triedy spolu s hodnotami, ktoré sa majú odovzdať konštruktorovi. Dostali sme prvé meno „jhone“ a druhé meno „kováč“. Potom sme kód spustili.

int hlavné ( int argc, char ** argv ) {

môj_názov_objektu1 ( 'Anna' , 'kováč' ) ;
môj_názov_objektu2 ;
meno2 = môj_objekt ( 'john', 'kováč' ) ;

meno1. šou ( ) ;
meno2. šou ( ) ;

Po vykonaní vyššie pridaného kódu máme výstup, ako je uvedené nižšie. Pre objekt „name1“ zobrazoval názov „Anna smith“ a pre druhý objekt „name2“ zobrazoval „Jhone Smith“. Ale tentoraz náš kód fungoval správne bez akýchkoľvek chýb.

Teraz vyskúšame inú metódu na úspešné vykonanie nášho kódu. Rovnako ako vo vyššie uvedených prípadoch sme sa pokúsili priradiť hodnoty k objektom pomocou operátora priradenia. Tentoraz však prejdeme hodnoty v čase deklarácie objektu. Ako môžeme vidieť v úryvku nižšie, v čase deklarácie objektu „name1“ sme odovzdali hodnoty ako argument objektu, pričom sme rovnaký krok zopakovali pre „name2“. Teraz znova spustíme kód.

int hlavné ( int argc, char ** argv ) {
môj_názov_objektu1 ( 'Anna' , 'kováč' ) ;
môj_názov_objektu2 ( 'john', 'kováč' ) ;
meno1. šou ( ) ;
meno2. šou ( ) ;

Po vykonaní kódu na tento čas sme nenarazili na žiadnu chybu, čo znamená, že nám to zabráni aj v chybách.

Záver

Stručne sme diskutovali o chybe, s ktorou sa môžeme stretnúť pri práci s funkciami, ku ktorým sa pristupuje z tried. Tiež sme študovali príčiny a metódy na vyriešenie chyby „žiadne životaschopné preťaženie“. Väčšinou je táto chyba pre nových programátorov ťažko pochopiteľná, preto sme sa im snažili uľahčiť jej odstránenie implementáciou príkladov a tiež jej vysvetlením.