Σφάλμα C++: Δεν υπάρχει υπερφόρτωση βιώσιμης '=':

Sphalma C Den Yparchei Yperphortose Biosimes



Τα σφάλματα είναι οι λειτουργίες που μπορεί να είναι το αποτέλεσμα της μη φυσιολογικής λειτουργίας οποιουδήποτε κώδικα. Το σφάλμα δεν μπορεί να εντοπιστεί τη στιγμή της εγγραφής μέχρι να εκτελέσουμε τον κώδικα ή να γίνει μεταγλώττιση. Ορισμένα σφάλματα απαγορεύουν την εκτέλεση του κώδικα μέχρι να αφαιρεθούν. Σήμερα, θα συζητήσουμε επίσης ένα σφάλμα που παρουσιάζεται επίσης κατά τη μεταγλώττιση του προγράμματος, το οποίο είναι 'σφάλμα: δεν υπάρχει αντιστοίχιση για το 'operator=''. Αυτό το σφάλμα μπορεί να προκληθεί για λόγους όπως: εάν έχουμε περάσει τον δείκτη όπου πρόκειται να περάσει η συμβολοσειρά, τροποποιώντας τη σταθερή μεταβλητή κ.λπ. Δεν είναι δύσκολο να αφαιρέσετε το σφάλμα 'no viable overloaded', αλλά η κύρια εργασία είναι να κατανοήστε το σφάλμα γιατί απλώς εμφανίζει το σφάλμα χωρίς καμία περιγραφή του σφάλματος.

Σύνταξη

Δεν υπάρχει τέτοια προκαθορισμένη σύνταξη για αυτό το σφάλμα, επειδή δεν είναι μέρος του κώδικα ή η έξοδος, είναι απλώς μια ασάφεια που μπορεί να προκληθεί λόγω λανθασμένου κώδικα. Όπως μπορούμε να δούμε, παρακάτω είναι ένα παράδειγμα για το πώς μπορεί να μοιάζει το σφάλμα.







λάθος : δεν ταιριάζει Για 'χειριστής = ''

Παράδειγμα #01:

Ας έχουμε μια ιδέα σχετικά με αυτό το σφάλμα και τη μέθοδο επίλυσής του. Για να το καταλάβουμε καλύτερα, θα εκτελέσουμε ένα παράδειγμα στο οποίο θα περάσουμε τα ονόματα χρησιμοποιώντας αντικείμενα στη συνάρτηση και στη συνέχεια θα τα εμφανίσει. Θα συμπεριλάβουμε πρώτα το αρχείο κεφαλίδας iostream. Μετά από αυτό, θα δηλώσουμε μια κλάση με το όνομα 'my_object'. Εντός των οποίων, έχουμε δηλώσει δύο μεταβλητές συμβολοσειράς με τα ονόματα 'F_name και 'L_name', το 'F_name' που υποδεικνύει το όνομα του ατόμου όπου το 'L_name' υποδεικνύει το επίθετο του ατόμου.



Στη συνέχεια, έχουμε δηλώσει έναν δημόσιο κατασκευαστή με το όνομα 'my_object()' στον οποίο εκχωρήσαμε null τιμές και στις δύο μεταβλητές 'F_name' και 'L_name'. Μετά από αυτό, δηλώσαμε μια άλλη συνάρτηση στην οποία περάσαμε τις μεταβλητές τύπου string “fn” και “ln”. Μέσα σε αυτό, καλέσαμε τη μέθοδο name_set(). Στη συνέχεια, δηλώσαμε δύο συναρτήσεις μέλους 'show()' και 'name_set()'. Όταν καλείται η συνάρτηση «show(), θα εμφανίζει μαζί τα ονόματα και τα επώνυμα. Ενώ, στη συνάρτηση μέλους «set_name()», περάσαμε δύο μεταβλητές συμβολοσειράς τύπου συμβολοσειράς «fn» και «ln» τις οποίες επίσης περάσαμε στον δεύτερο κατασκευαστή.



Τώρα, χρησιμοποιώντας τον τελεστή αντιγραφής της κλάσης my_object, παίρνουμε μια παράμετρο τύπου 'my_object'. Ο μεταγλωττιστής το δηλώνει πάντα ως ενσωματωμένο δημόσιο μέλος οποιασδήποτε κλάσης. Μέσα σε αυτό το μέλος, έχουμε αντιστοιχίσει το src.F_name στο 'F_name' και το src.L_name στο 'L_name' που έχουμε διατηρήσει το αντίγραφο των 'F_name' και 'L_name'. Αυτό μεταβιβάζεται στα μέλη της κλάσης my_object. Τώρα, έχουμε δηλώσει ένα αντικείμενο της κλάσης my_cobject με το όνομα 'name1' στο οποίο περάσαμε δύο συμβολοσειρές 'Anna' και 'smith' ως όρισμα. Αυτό θα καλέσει τον κατασκευαστή και θα εμφανίσει το όνομα μαζί με το επίθετο.





Μετά από αυτό, δημιουργήσαμε ένα άλλο αντικείμενο 'name2' και στη συνέχεια εκχωρήσαμε το όνομα σε αυτό το αντικείμενο ξεχωριστά. Αφού περάσαμε τιμές στον κατασκευαστή και για τα δύο αντικείμενα, καλέσαμε τη μέθοδο show() η οποία θα εμφανίσει στη συνέχεια τα ονόματα και για τα δύο αντικείμενα 'nam1' και 'name2'. Στο τέλος του κώδικα, επιστρέψαμε τη μηδενική τιμή και εκτελέσαμε τον κώδικά μας.

περιλαμβάνω
τάξη my_object {
ιδιωτικός :
std :: σειρά F_name, L_name ;
δημόσιο :
my_object ( ) { F_name = '' ; L_name = '' ; }
my_object ( std :: σειρά fn, std :: σειρά ln ) {
όνομα_σύνολο ( fn, ln ) ;
}
κενός προβολή ( ) { std :: cout << 'Το όνομα είναι ' << F_name << '' << L_name << '. \n ' ; }
κενός όνομα_σύνολο ( std :: σειρά fn, std :: σειρά ln ) { F_name = στ ; L_name = ln ; }
my_object & χειριστής = ( συνθ my_object & src ) {
F_name = src. F_name ;
L_name = src. L_name ;
ΕΠΙΣΤΡΟΦΗ * Αυτό ;
}

} ;
ενθ κύριος ( ενθ argc, απανθρακώνω ** argv ) {
my_object name1 ( 'Αννα' , 'σιδηρουργός' ) ;
my_object name2 ;
όνομα2 = ( 'Αννα' , 'σιδηρουργός' ) ;
όνομα 1. προβολή ( ) ;
όνομα2. προβολή ( ) ;
ΕΠΙΣΤΡΟΦΗ 0 ;
}

Μετά την εκτέλεση του κώδικά μας, έχουμε αυτό το σφάλμα το οποίο εμφανίζει ότι έχουμε γράψει λάθος κώδικα στη γραμμή 24, υποδεικνύοντας τον τύπο του σφάλματος που παρουσιάζεται 'σφάλμα: δεν ταιριάζει για το 'operator=''. Τώρα, θα προσπαθήσουμε να επιλύσουμε αυτό το σφάλμα.



Για την επίλυση αυτού του σφάλματος, έχουμε πολλούς τρόπους για να μεταβιβάσουμε τις τιμές στον κατασκευαστή οποιασδήποτε κλάσης. Στην πρώτη μέθοδο, θα αντιστοιχίσουμε απλώς το αντικείμενο 'name1' στο 'name2' επειδή έχουμε περάσει τις ίδιες τιμές και στα δύο αντικείμενα, επομένως δεν χρειάζεται να τα μεταβιβάσουμε χωριστά. Τώρα εκτελούμε τον κώδικα.

ενθ κύριος ( ενθ argc, απανθρακώνω ** argv ) {

my_object name1 ( 'Αννα' , 'σιδηρουργός' ) ;
my_object name2 ;
όνομα2 = όνομα 1 ;
όνομα 1. προβολή ( ) ;
όνομα2. προβολή ( ) ;

Αφού κάνουμε αλλαγές στον κώδικα όπως φαίνεται παραπάνω, έχουμε το αποτέλεσμα που δίνεται στο παρακάτω απόσπασμα. Εμφανίσαμε ότι το όνομα που μεταβιβάστηκε στον κατασκευαστή εμφανίζεται με επιτυχία χωρίς κανένα σφάλμα.

Η δεύτερη μέθοδος για την επίλυση αυτού του σφάλματος είναι όταν πρέπει να περάσουμε τις διαφορετικές τιμές και στα δύο αντικείμενα. Απλώς θα χρησιμοποιήσουμε το όνομα της κλάσης μαζί με τις τιμές που πρόκειται να περάσουν στον κατασκευαστή ως όρισμα. Περάσαμε το πρώτο όνομα 'jhone' και το δεύτερο όνομα 'smith'. Στη συνέχεια, εκτελέσαμε τον κώδικα.

ενθ κύριος ( ενθ argc, απανθρακώνω ** argv ) {

my_object name1 ( 'Αννα' , 'σιδηρουργός' ) ;
my_object name2 ;
όνομα2 = my_object ( 'Τζον Σμιθ' ) ;

όνομα 1. προβολή ( ) ;
όνομα2. προβολή ( ) ;

Αφού εκτελέσουμε τον κώδικα που προστέθηκε παραπάνω, έχουμε την έξοδο όπως φαίνεται παρακάτω. Για το αντικείμενο 'name1', εμφάνιζε το όνομα 'Anna smith' και για το δεύτερο αντικείμενο 'name2' εμφάνιζε 'Jhone Smith'. Αλλά αυτή τη φορά ο κώδικάς μας λειτούργησε σωστά χωρίς κανένα σφάλμα σε αυτόν.

Τώρα, θα δοκιμάσουμε μια άλλη μέθοδο για την επιτυχή εκτέλεση του κώδικά μας. Όπως και στις παραπάνω περιπτώσεις, προσπαθήσαμε να εκχωρήσουμε τις τιμές στα αντικείμενα χρησιμοποιώντας τον τελεστή εκχώρησης. Αλλά αυτή τη φορά, θα περάσουμε τις τιμές τη στιγμή της δήλωσης του αντικειμένου. Όπως μπορούμε να δούμε στο παρακάτω απόσπασμα, τη στιγμή της δήλωσης ενός αντικειμένου 'name1', περάσαμε τις τιμές ως όρισμα στο αντικείμενο επαναλαμβάνοντας το ίδιο βήμα για το 'name2'. Τώρα, εκτελούμε τον κώδικα για άλλη μια φορά.

ενθ κύριος ( ενθ argc, απανθρακώνω ** argv ) {
my_object name1 ( 'Αννα' , 'σιδηρουργός' ) ;
my_object name2 ( 'Τζον Σμιθ' ) ;
όνομα 1. προβολή ( ) ;
όνομα2. προβολή ( ) ;

Αφού εκτελεστεί ο κώδικας και για αυτό το διάστημα, δεν έχουμε αντιμετωπίσει κανένα σφάλμα που σημαίνει ότι αυτό θα μας αποτρέψει επίσης από τυχόν σφάλματα.

συμπέρασμα

Συζητήσαμε εν συντομία ένα σφάλμα που μπορεί να αντιμετωπίσουμε κατά την εργασία σε συναρτήσεις που έχουν πρόσβαση από κλάσεις. Μελετήσαμε επίσης τις αιτίες και τις μεθόδους επίλυσης του σφάλματος 'χωρίς βιώσιμη υπερφόρτωση'. Κυρίως αυτό το σφάλμα είναι δύσκολο να γίνει κατανοητό για τους νέους προγραμματιστές, γι' αυτό προσπαθήσαμε να τους διευκολύνουμε να απαλλαγούν από αυτό, εφαρμόζοντας παραδείγματα και επίσης με την εξήγησή του.