C++ klaida: nėra gyvybingų perkrautų „=“:

C Klaida Nera Gyvybingu Perkrautu



Klaidos yra operacijos, kurios gali būti nenormalaus bet kurio kodo veikimo rezultatas. Klaida negali būti aptikta rašant, kol nevykdėme kodo arba jis nėra sukompiliuotas. Kai kurios klaidos neleidžia vykdyti kodo, kol jos nepašalinamos. Šiandien taip pat aptarsime klaidą, kuri taip pat pasitaiko sukūrus programą, tai yra „klaida: nėra „operatoriaus=“ atitikties. Šią klaidą gali sukelti tokios priežastys: jei perdavėme žymeklį, kur turi būti perduodama eilutė, keičiame pastovų kintamąjį ir pan. Pašalinti klaidą „nėra gyvybingos perkrautos“ nėra sunku, tačiau pagrindinė užduotis yra suprasti klaidą, nes ji tik parodo klaidą be jokio klaidos aprašymo.

Sintaksė

Tokios iš anksto nustatytos šios klaidos sintaksės nėra, nes tai nėra kodo ar išvesties dalis, tai tik dviprasmybė, kurią gali sukelti netinkamas kodas. Kaip matome, toliau pateikiamas pavyzdys, kaip gali atrodyti klaida.







klaida : nesutampa dėl 'operatorius =

01 pavyzdys:

Leiskite mums suprasti šią klaidą ir jos sprendimo būdą. Kad geriau suprastume, pateiksime pavyzdį, kuriame vardus naudosime objektus funkcijai, o tada ji juos parodys. Pirmiausia įtrauksime antraštės failą „iostream“. Po to paskelbsime klasę pavadinimu „mano_objektas“. Jo viduje paskelbėme du eilučių kintamuosius, pavadintus „F_name“ ir „L_name“, „F_name“, kuris nurodo asmens vardą, o „L_name“ nurodo asmens pavardę.



Tada paskelbėme viešą konstruktorių, pavadintą „my_object()“, kuriame kintamiesiems „F_name“ ir „L_name“ priskyrėme nulines reikšmes. Po to paskelbėme kitą funkciją, kuriai perdavėme eilutės tipo kintamuosius „fn“ ir „ln“. Viduje mes iškvietėme metodą name_set (). Tada paskelbėme dvi narių funkcijas „show ()“ ir „name_set ()“. Kai iškviečiama funkcija „show()“, kartu bus rodomi vardai ir pavardės. Tuo tarpu nario funkcijoje „set_name()“ perdavėme du „fn“ ir „ln“ tipo eilutės kintamuosius, kuriuos taip pat perdavėme antrajam konstruktoriui.



Dabar, naudodami klasės mano_objektas kopijavimo priskyrimo operatorių, paimame vieną parametrą, kurio tipas yra „my_object“. Kompiliatorius visada deklaruoja jį kaip bet kurios klasės viešąjį narį. Šio nario viduje mes priskyrėme src.F_name prie 'F_name' ir src.L_name prie 'L_name', todėl išsaugojome 'F_name' ir 'L_name' kopijas. Tai perduodama klasės my_object nariams. Dabar paskelbėme klasės my_cobject objektą pavadinimu „vardas1“, kuriam kaip argumentą perdavėme dvi eilutes „Anna“ ir „Smith“. Tai iškvies konstruktorių ir parodys vardą kartu su pavarde.





Po to sukūrėme kitą objektą „vardas2“, o tada priskyrėme pavadinimą tam objektui atskirai. Perdavus abiejų objektų reikšmes konstruktoriui, iškvietėme metodą show(), kuris parodys abiejų objektų pavadinimus „nam1“ ir „name2“. Kodo pabaigoje grąžinome nulinę reikšmę ir įvykdėme savo kodą.

įtraukti
klasė mano_objektas {
privatus :
std :: styga F_vardas, L_vardas ;
viešas :
mano_objektas ( ) { F_vardas = ' ' ; L_vardas = ' ' ; }
mano_objektas ( std :: styga fn, std :: styga ln ) {
name_set ( fn, ln ) ;
}
tuštuma Rodyti ( ) { std :: cout << 'Vardas yra' << F_vardas << ' ' << L_vardas << “. \n ; }
tuštuma name_set ( std :: styga fn, std :: styga ln ) { F_vardas = fn ; L_vardas = ln ; }
mano_objektas & operatorius = ( konst mano_objektas & src ) {
F_vardas = src. F_vardas ;
L_vardas = src. L_vardas ;
grąžinti * tai ;
}

} ;
tarpt pagrindinis ( tarpt argc, char ** argv ) {
mano_objekto pavadinimas1 ( 'Anna' , 'Kalvis' ) ;
mano_objekto pavadinimas2 ;
vardas2 = ( 'Anna' , 'Kalvis' ) ;
vardas1. Rodyti ( ) ;
vardas2. Rodyti ( ) ;
grąžinti 0 ;
}

Vykdydami kodą, mes turime šią klaidą, kuri rodo, kad 24 eilutėje parašėme neteisingą kodą, nurodantį klaidos tipą, su kuria susidurta „klaida: nėra „operatoriaus=“ atitikties. Dabar pabandysime išspręsti šią klaidą.



Norėdami išspręsti šią klaidą, turime kelis būdus, kaip perduoti reikšmes bet kurios klasės konstruktoriui. Pirmuoju metodu mes tiesiog priskirsime objektą 'name1' prie 'name2', nes abiem objektams perdavėme tas pačias reikšmes, todėl nereikia jų perduoti atskirai. Dabar vykdome kodą.

tarpt pagrindinis ( tarpt argc, char ** argv ) {

mano_objekto pavadinimas1 ( 'Anna' , 'Kalvis' ) ;
mano_objekto pavadinimas2 ;
vardas2 = vardas1 ;
vardas1. Rodyti ( ) ;
vardas2. Rodyti ( ) ;

Atlikę kodo pakeitimus, kaip parodyta aukščiau, gauname rezultatą, pateiktą toliau pateiktame fragmente. Mes parodėme, kad konstruktoriui perduotas vardas rodomas sėkmingai be klaidų.

Antrasis būdas išspręsti šią klaidą yra tada, kai turime perduoti skirtingas reikšmes abiem objektams. Tiesiog kaip argumentą naudosime klasės pavadinimą kartu su reikšmėmis, kurios turi būti perduotos konstruktoriui. Perdavėme pirmąjį vardą „jhone“, o antrąjį – „kalvis“. Tada mes įvykdėme kodą.

tarpt pagrindinis ( tarpt argc, char ** argv ) {

mano_objekto pavadinimas1 ( 'Anna' , 'Kalvis' ) ;
mano_objekto pavadinimas2 ;
vardas2 = mano_objektas ( 'džonas', 'kalvis' ) ;

vardas1. Rodyti ( ) ;
vardas2. Rodyti ( ) ;

Įvykdę aukščiau pridėtą kodą, gauname išvestį, kaip parodyta žemiau. Objektui „name1“ buvo rodomas pavadinimas „Anna Smith“, o antrajam objektui „name2“ – „Jhone Smith“. Tačiau šį kartą mūsų kodas veikė tinkamai, be jokių klaidų.

Dabar išbandysime kitą metodą, kaip sėkmingai vykdyti mūsų kodą. Kaip ir aukščiau minėtais atvejais, mes bandėme objektams priskirti reikšmes naudodami priskyrimo operatorių. Tačiau šį kartą perduosime objekto deklaravimo metu esančias vertes. Kaip matome toliau pateiktame fragmente, deklaruodami objektą „name1“, mes perdavėme reikšmes kaip argumentą objektui, kartodami tą patį veiksmą „vardas2“. Dabar dar kartą vykdome kodą.

tarpt pagrindinis ( tarpt argc, char ** argv ) {
mano_objekto pavadinimas1 ( 'Anna' , 'Kalvis' ) ;
mano_objekto pavadinimas2 ( 'džonas', 'kalvis' ) ;
vardas1. Rodyti ( ) ;
vardas2. Rodyti ( ) ;

Po to, kai kodas buvo vykdomas ir šį laiką, mes neaptikome jokios klaidos, o tai reiškia, kad tai taip pat neleis mums klaidų.

Išvada

Trumpai aptarėme klaidą, su kuria galime susidurti dirbdami su funkcijomis, kurios pasiekiamos iš klasių. Taip pat ištyrėme priežastis ir būdus, kaip išspręsti klaidą „nėra gyvybingos perkrovos“. Dažniausiai šią klaidą sunku suprasti naujiems programuotojams, todėl mes stengėmės, kad jie būtų lengviau to pašalinti, įgyvendindami pavyzdžius ir paaiškindami.