Błąd C ++ Brak żywej przeciążenia '='

Błąd C ++ Brak żywej przeciążenia '='

Błędy to operacje, które mogą być wynikiem nienormalnego działania dowolnego kodu. Błąd nie można wykryć w momencie pisania, dopóki nie wykonamy kodu lub zostanie skompilowany. Niektóre błędy zabraniają wykonywania kodu, dopóki nie zostaną usunięte. Dzisiaj omówimy również błąd, który występuje również, gdy program zostanie skompilowany, to jest „Błąd: brak dopasowania do„ operatora = ””. Ten błąd może być spowodowany z powodów: jeśli przekazaliśmy wskaźnik, w którym ciąg ma zostać przekazany, modyfikując stałą zmienną itp. Nie jest trudno usunąć błąd „bez opłacalnej przeciążonej”, ale głównym zadaniem jest zrozumienie błędu, ponieważ po prostu pokazuje błąd bez żadnego opisu błędu.

Składnia

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

Błąd: brak dopasowania dla „Operator =”

Przykład nr 01:

Miejmy pomysł na ten błąd i metodę rozwiązania tego. Aby to lepiej zrozumieć, wykonamy przykład, w którym zamierzamy przekazać nazwy za pomocą obiektów do funkcji, a następnie wyświetli je. Najpierw dołączymy plik nagłówka iostream. Następnie zadeklarujemy klasę o nazwie „My_Object”. W środku zadeklarowaliśmy dwie zmienne ciągów o nazwie „f_name i„ l_name ”,„ nazwa f_name ”, która wskazuje na imię osoby, w której„ nazwa l_name ”wskazuje nazwisko osoby.

Następnie zadeklarowaliśmy publicznego konstruktora o nazwie „my_Object ()”, w którym przypisaliśmy wartości zerowe zarówno do zmiennych „f_name”, jak i „l_name”. Następnie zadeklarowaliśmy inną funkcję, do której przekazaliśmy zmienne typu ciągów „FN” i „LN”. Wewnątrz nazywaliśmy metodę name_set (). Następnie zadeklarowaliśmy dwie funkcje członkowskie „show ()” i „name_set ()”. Po wywołaniu funkcji „show () wyświetli razem pierwsze imiona. Podczas gdy w funkcji członka „set_name ()” przeszliśmy dwie zmienne ciągów typu ciągów „fn” i „ln”, które również przekazaliśmy drugiego konstruktora.

Teraz, korzystając z operatora przypisania kopii klasy my_Object, bierzemy jeden parametr typu „my_Object”. Kompilator zawsze deklaruje to jako członek publiczny dowolnej klasy. Wewnątrz tego członka przypisaliśmy SRC.F_name do „f_name” i src.L_name do „l_name”, którą 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 „Name1”, do którego przekazaliśmy dwa ciągi „Anna” i „Smith” jako argument. To wywoła konstruktor i wyświetli imię wraz z nazwiskiem.

Następnie utworzyliśmy inny obiekt „name2”, a następnie przypisaliśmy nazwę do tego obiektu osobno. Po przekazaniu wartości do konstruktora dla obu obiektów, nazywaliśmy metodę show (), która następnie wyświetli nazwy dla obu obiektów „NAM1” i „Name2”. Na końcu kodu zwróciliśmy wartość zerową i wykonaliśmy nasz kod.

włączać
klasa my_object
prywatny:
std :: string f_name, l_name;
publiczny:
my_Object () f_name = ""; L_name = "";
my_Object (std :: String fn, std :: String ln)
name_set (fn, ln);

void show () std :: cout << "The name is " << F_name << " " << L_name << ".\n";
void name_set (std :: String fn, std :: String ln) f_name = fn; L_name = ln;
my_Object & operator = (const my_object & src)
F_name = src.F_name;
L_name = src.L_name;
zwróć *to;

;
int main (int argc, char ** argv)
My_Object Name1 („Anna”, „Smith”);
my_object name2;
name2 = („Anna”, „Smith”);
Nazwa 1.pokazywać();
Nazwa2.pokazywać();
powrót 0;

Po wykonaniu naszego kodu mamy ten błąd, który wyświetla się, że napisaliśmy niewłaściwy kod w wierszu 24, wskazując rodzaj błędu napotkanego „Błąd: brak dopasowania dla„ operator = ””. Teraz spróbujemy rozwiązać ten błąd.

W celu rozwiązania tego błędu mamy wiele sposobów przekazywania wartości konstruktorowi dowolnej klasy. W pierwszej metodzie po prostu przypiszmy obiekt „name1” do „name2”, ponieważ przekazaliśmy te same wartości do obu obiektów, więc nie trzeba ich przekazywać osobno. Teraz wykonujemy kod.

int main (int argc, char ** argv)
My_Object Name1 („Anna”, „Smith”);
my_object name2;
name2 = name1;
Nazwa 1.pokazywać();
Nazwa2.pokazywać();

Po wprowadzeniu zmian w kodzie, jak pokazano powyżej, mamy wynik podany w fragmencie poniżej. Wyświetliliśmy nazwę przekazaną do konstruktora, jest wyświetlana pomyślnie bez żadnego błędu.

Drugą metodą rozwiązania tego błędu jest to, że musimy przekazać różne wartości do obu obiektów. Po prostu użyjemy nazwy klasy wraz z wartościami, które należy przekazać konstruktorowi jako argument. Minęliśmy imię „Jhone” i drugie imię „Smith”. Następnie wykonaliśmy kod.

int main (int argc, char ** argv)
My_Object Name1 („Anna”, „Smith”);
my_object name2;
name2 = my_Object („Jhone”, „Smith”);
Nazwa 1.pokazywać();
Nazwa2.pokazywać();

Po wykonaniu wyżej dodanego kodu mamy dane wyjściowe, jak pokazano poniżej. Dla obiektu „Nazwa1” wyświetlił nazwę „Anna Smith”, a dla drugiego obiektu „Nazwa2” wyświetlał „Jhone Smith”. Ale tym razem nasz kod działał poprawnie bez żadnych błędów.

Teraz wypróbujemy inną metodę pomyślnego wykonywania naszego kodu. Podobnie jak w powyższych przypadkach, próbowaliśmy przypisać wartości do obiektów za pomocą operatora przypisania. Ale tym razem przekazamy wartości w momencie deklaracji obiektu. Jak widać w fragmencie poniżej, w momencie deklaracji obiektu „Name1”, przekazaliśmy wartości jako argument obiektu, powtarzając ten sam krok dla „Name2”. Teraz ponownie wykonujemy kod.

int main (int argc, char ** argv)
My_Object Name1 („Anna”, „Smith”);
My_Object Name2 („Jhone”, „Smith”);
Nazwa 1.pokazywać();
Nazwa2.pokazywać();

Po wykonaniu kodu w tym czasie nie napotkaliśmy żadnego błędu, co oznacza, że ​​uniemożliwi nam to również popełnienie błędów.

Wniosek

Krótko omówiliśmy błąd, z którym możemy się napotkać podczas pracy nad funkcjami, do których można uzyskać dostęp z klas. Zbadaliśmy również przyczyny i metody rozwiązania błędu „bez opłacalnej przeciążenia”. Przeważnie ten błąd jest trudny do zrozumienia dla nowych programistów, dlatego staraliśmy się, aby ułatwić się pozbycie tego, wdrażając przykłady, a także z jego wyjaśnieniem.