Błąd C++: brak wykonalnego przeciążenia „=”:

Blad C Brak Wykonalnego Przeciazenia



Błędy to operacje, które mogą być wynikiem nieprawidłowego działania dowolnego kodu. Błąd nie może zostać wykryty w momencie pisania, dopóki nie wykonamy kodu lub nie zostanie on skompilowany. Niektóre błędy uniemożliwiają wykonanie kodu, dopóki nie zostaną usunięte. Dzisiaj omówimy również błąd, który pojawia się również podczas kompilacji programu, czyli „błąd: brak dopasowania dla„ operator = ”. Ten błąd może być spowodowany takimi przyczynami jak: jeśli przekroczyliśmy wskaźnik, do którego należy przekazać ciąg znaków, modyfikując zmienną stałą itp. Usunięcie błędu „no viable przeciążony” nie jest trudne, ale głównym zadaniem jest zrozumieć błąd, ponieważ po prostu pokazuje błąd bez żadnego opisu błędu.

Składnia

Nie ma takiej predefiniowanej składni dla tego błędu, ponieważ nie jest to część kodu ani dane wyjściowe, to tylko dwuznaczność, która może być spowodowana niewłaściwym kodem. Jak widać, poniżej znajduje się przykład tego, jak może wyglądać błąd.







błąd : nie pasuje dla 'operator = '

Przykład nr 01:

Daj nam wyobrażenie o tym błędzie i metodzie rozwiązania tego problemu. Aby lepiej to zrozumieć, wykonamy przykład, w którym będziemy przekazywać nazwy za pomocą obiektów do funkcji, a ona następnie je wyświetli. Najpierw dołączymy plik nagłówkowy iostream. Następnie zadeklarujemy klasę o nazwie „my_object”. Wewnątrz których zadeklarowaliśmy dwie zmienne łańcuchowe o nazwach „F_name i „L_name”, „F_name” wskazujące imię osoby, gdzie „L_name” wskazuje nazwisko osoby.



Następnie zadeklarowaliśmy publiczny konstruktor o nazwie „my_object()”, w którym przypisaliśmy wartości null obu zmiennym „F_name” i „L_name”. Następnie zadeklarowaliśmy kolejną funkcję, do której przekazaliśmy zmienne typu string „fn” i „ln”. Wewnątrz tego wywołaliśmy metodę name_set(). Następnie zadeklarowaliśmy dwie funkcje składowe „show()” i „name_set()”. Po wywołaniu funkcji „show()” zostaną wyświetlone imiona i nazwiska razem. Natomiast w funkcji składowej „set_name()” przekazaliśmy dwie zmienne łańcuchowe typu „fn” i „ln”, które również przekazaliśmy drugiemu konstruktorowi.



Teraz, używając operatora przypisania kopiowania klasy my_object, bierzemy jeden parametr typu „my_object”. Kompilator zawsze deklaruje go jako wbudowany element publiczny dowolnej klasy. Wewnątrz tego członka przypisaliśmy src.F_name do „F_name” i src.L_name do „L_name”, że zachowaliśmy kopię „F_name” i „L_name”. Jest to przekazywane członkom klasy my_object. Teraz zadeklarowaliśmy obiekt klasy my_cobject o nazwie „nazwa1”, do którego jako argument przekazaliśmy dwa ciągi znaków „Anna” i „kowalski”. Spowoduje to wywołanie konstruktora i wyświetlenie imienia wraz z nazwiskiem.





Następnie utworzyliśmy kolejny obiekt „nazwa2”, a następnie osobno przypisaliśmy nazwę temu obiektowi. Po przekazaniu wartości obu obiektom do konstruktora wywołaliśmy metodę show(), która następnie wyświetli nazwy obu obiektów „nam1” i „name2”. Na końcu kodu zwróciliśmy wartość null i wykonaliśmy nasz kod.

włączać
klasa mój_obiekt {
prywatny :
standardowe :: strunowy F_nazwa, L_nazwa ;
publiczny :
mój_obiekt ( ) { F_nazwa = ' ' ; L_nazwa = ' ' ; }
mój_obiekt ( standardowe :: strunowy fn, std :: strunowy ln ) {
zestaw_nazw ( fn, ln ) ;
}
próżnia pokazać ( ) { standardowe :: cout << 'Imię to ' << F_nazwa << ' ' << L_nazwa << '. \n ' ; }
próżnia zestaw_nazw ( standardowe :: strunowy fn, std :: strunowy ln ) { F_nazwa = fn ; L_nazwa = ln ; }
mój_obiekt & operator = ( konst mój_obiekt & źródło ) {
F_nazwa = źródło F_nazwa ;
L_nazwa = źródło L_nazwa ;
zwrócić * ten ;
}

} ;
int Główny ( int argc, zwęglać ** argv ) {
nazwa_mojego_obiektu1 ( 'Ania' , 'kowal' ) ;
nazwa_mojego_obiektu2 ;
imię2 = ( 'Ania' , 'kowal' ) ;
nazwa1. pokazać ( ) ;
imię2. pokazać ( ) ;
zwrócić 0 ;
}

Po wykonaniu naszego kodu mamy ten błąd, który pokazuje, że w linii 24 napisaliśmy zły kod, wskazując typ napotkanego błędu „błąd: brak dopasowania dla„ operator = ”. Teraz spróbujemy rozwiązać ten błąd.



Aby rozwiązać ten błąd, mamy wiele sposobów przekazywania wartości do konstruktora dowolnej klasy. W pierwszej metodzie po prostu przypiszemy obiekt „nazwa1” do obiektu „nazwa2”, ponieważ przekazaliśmy te same wartości do obu obiektów, więc nie ma potrzeby przekazywania ich osobno. Teraz wykonujemy kod.

int Główny ( int argc, zwęglać ** argv ) {

nazwa_mojego_obiektu1 ( 'Ania' , 'kowal' ) ;
nazwa_mojego_obiektu2 ;
imię2 = nazwa1 ;
nazwa1. pokazać ( ) ;
imię2. pokazać ( ) ;

Po dokonaniu zmian w kodzie, jak pokazano powyżej, mamy wynik podany we fragmencie poniżej. Wyświetliliśmy, że nazwa przekazana do konstruktora jest wyświetlana pomyślnie bez żadnego błędu.

Druga metoda rozwiązania tego błędu polega na przekazaniu różnych wartości do obu obiektów. Jako argumentu użyjemy po prostu nazwy klasy wraz z wartościami, które mają zostać przekazane konstruktorowi. Minęliśmy imię „jhone” i drugie imię „smith”. Następnie wykonaliśmy kod.

int Główny ( int argc, zwęglać ** argv ) {

nazwa_mojego_obiektu1 ( 'Ania' , 'kowal' ) ;
nazwa_mojego_obiektu2 ;
imię2 = mój_obiekt ( 'John Smith' ) ;

nazwa1. pokazać ( ) ;
imię2. pokazać ( ) ;

Po wykonaniu wyżej dodanego kodu mamy dane wyjściowe, jak pokazano poniżej. Dla obiektu „nazwa1” wyświetlana jest nazwa „Anna Kowal”, a dla drugiego obiektu „nazwa2” wyświetlana jest nazwa „Jhone Kowalski”. Ale tym razem nasz kod działał poprawnie, bez żadnych błędów.

Teraz wypróbujemy inną metodę pomyślnego wykonania naszego kodu. Podobnie jak w powyższych przypadkach próbowaliśmy przypisać wartości obiektom za pomocą operatora przypisania. Ale tym razem przekażemy wartości w momencie deklaracji obiektu. Jak widać na poniższym fragmencie, w momencie deklaracji obiektu „nazwa1” przekazaliśmy wartości jako argument do obiektu powtarzającego ten sam krok dla „nazwy2”. Teraz ponownie wykonujemy kod.

int Główny ( int argc, zwęglać ** argv ) {
nazwa_mojego_obiektu1 ( 'Ania' , 'kowal' ) ;
nazwa_mojego_obiektu2 ( 'John Smith' ) ;
nazwa1. pokazać ( ) ;
imię2. pokazać ( ) ;

Po wykonaniu kodu również przez ten czas nie napotkaliśmy żadnego błędu, co oznacza, że ​​zapobiegnie to również wystąpieniu jakichkolwiek błędów.

Wniosek

Pokrótce omówiliśmy błąd, który możemy napotkać podczas pracy nad funkcjami, do których dostęp uzyskuje się z klas. Zbadaliśmy również przyczyny i metody rozwiązania błędu „nie można przeciążyć”. Przeważnie ten błąd jest trudny do zrozumienia dla nowych programistów, więc staraliśmy się ułatwić im pozbycie się go, wdrażając przykłady, a także wyjaśniając.