Τρόπος επίλυσης του σφάλματος 'No Matching Constructor for Initialization of' στη C++

Tropos Epilyses Tou Sphalmatos No Matching Constructor For Initialization Of Ste C



Στη C++ ένας κατασκευαστής είναι μια συγκεκριμένη συνάρτηση μέλους που παίρνει το όνομά της από το όνομα της κλάσης με την οποία σχετίζεται. Χρησιμοποιείται για την προετοιμασία ορισμένων χρήσιμων τιμών για τα μέλη του αντικειμένου. Εάν ο κατασκευαστής δεν ορίζεται από τον χρήστη, ο μεταγλωττιστής C++ δημιουργεί έναν προεπιλεγμένο κατασκευαστή και δεν αναμένει καμία παράμετρο και ένα κενό σώμα. Ωστόσο, όταν υπάρχει ένας κατασκευαστής που ορίζεται από το χρήστη, είναι απαραίτητο να δηλώσετε το σώμα και τις παραμέτρους του.

Τι προκαλεί το σφάλμα 'No Matching Constructor for Initialization of' στην C++;

Όταν ασχολούμαστε με κατασκευαστές στη C++, αντιμετωπίζεται το σφάλμα 'No Matching Constructor for Initialization of' αυτό συμβαίνει συνήθως επειδή όταν ένας κατασκευαστής ονομάζεται ο προεπιλεγμένος κατασκευαστής από τον μεταγλωττιστή δεν δημιουργείται, οπότε πρέπει να δηλώσετε μόνοι σας τις παραμέτρους και το σώμα του κατασκευαστή. Η αποτυχία δήλωσης των κατάλληλων παραμέτρων οδηγεί σε αυτόν τον τύπο σφάλματος κατασκευαστή.







Δημιουργήστε ένα απλό αρχείο κειμένου, επικολλήστε τον κώδικα της συνάρτησης Square() σε αυτό και αποθηκεύστε το με την επέκταση .h. Τώρα επικολλήστε αυτό το αρχείο στον φάκελο συμπερίληψης του φακέλου bin του μεταγλωττιστή CPP. Τώρα, όταν καλείτε αυτό το αρχείο κεφαλίδας στο main.cpp, αυτό το αρχείο θα διαβαστεί από τον μεταγλωττιστή.



Αρχείο κεφαλίδας Square.h

#ifndef SQUARE_H

#define SQUARE_H


τάξη τετράγωνο {

ιδιωτικός :

διπλό μήκος ;

διπλό πλάτος ;

δημόσιο :

τετράγωνο ( διπλό , διπλό ) ;

διπλό getLength ( ) συνθ ;

διπλό getWidth ( ) συνθ ;

} ;



τετράγωνο :: τετράγωνο ( διπλό μεγάλο, διπλό Σε ) {

μήκος = μεγάλο ;
πλάτος = Σε ;

}



διπλό τετράγωνο :: getWidth ( ) συνθ { ΕΠΙΣΤΡΟΦΗ πλάτος ; }

διπλό τετράγωνο :: getLength ( ) συνθ { ΕΠΙΣΤΡΟΦΗ μήκος ; }



#τέλος εαν

Αρχείο κεφαλίδας main.cpp

#include

#include 'square.h'

χρησιμοποιώντας χώρο ονομάτων std ;



ενθ κύριος ( )

{

Τετράγωνο κουτί 1 ( 10.0 , 10.0 ) ;

Τετράγωνο κουτί 2 ;



cout << ' πλάτος και μήκος του κουτιού 1: ' << κουτί 1. getWidth ( ) << ',' << κουτί 1. getLength ( ) << endl ;

cout << ' πλάτος και μήκος του κουτιού 2: ' << κουτί 2. getWidth ( ) << ',' << κουτί 2. getLength ( ) << endl ;



κουτί 2 = κουτί 1 ;

cout << 'Όταν το τετράγωνο πλαίσιο 1 είναι ίσο με το τετράγωνο πλαίσιο 2' << endl ;

cout << ' πλάτος και μήκος του κουτιού 1: ' << κουτί 1. getWidth ( ) << ',' << κουτί 1. getLength ( ) << endl ;

cout << ' πλάτος και μήκος του κουτιού 2: ' << κουτί 2. getWidth ( ) << ',' << κουτί 2. getLength ( ) << endl ;



ΕΠΙΣΤΡΟΦΗ 0 ;

}

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




Ο μεταγλωττιστής επιστρέφει το σφάλμα στη γραμμή #14 επειδή ο ανάδοχος αναμένει δύο ορίσματα ενώ δεν του παρέχονται ορίσματα:





Στη γραμμή #8, ο μεταγλωττιστής επιστρέφει ένα σφάλμα στον κατασκευαστή επειδή τα ορίσματα δεν παρέχονται ενώ πρέπει να υπάρχουν τα καθορισμένα ορίσματα.

Τρόπος επίλυσης του σφάλματος 'No Matching Constructor for Initialization of' στη C++

Ο μεταγλωττιστής εμφανίζει το σφάλμα στη γραμμή#8 του κώδικα main.cpp επειδή επιχειρείται να γίνει κλήση του προεπιλεγμένου κατασκευαστή του Square. Ο μεταγλωττιστής δεν μπορεί να δημιουργήσει έναν προεπιλεγμένο κατασκευαστή επειδή υπάρχει ήδη ένας κατασκευαστής που έχει οριστεί από το χρήστη που παίρνει δύο ορίσματα. Επομένως, καθορίστε τις παραμέτρους του ως εξής:



Τετράγωνο κουτί 2 ( 0 , 10 ) ;

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

τετράγωνο :: τετράγωνο ( διπλό μεγάλο = 0 , διπλό Σε = 0 )

Το σφάλμα του κατασκευαστή μπορεί να διορθωθεί καλώντας και δηλώνοντας σωστά τον κατασκευαστή και τις παραμέτρους του. Οι κωδικοί στα main.cpp και Square.h αλλάζουν σύμφωνα με τις οδηγίες που δίνονται παραπάνω. Και το σφάλμα κατασκευής μη αντιστοίχισης επιλύθηκε. Αυτός είναι ο ενημερωμένος κώδικας για το αρχείο κεφαλίδας:

Αυτός είναι ο ενημερωμένος κώδικας για το κύριο αρχείο:

Οι παραπάνω κωδικοί μετά από σφάλματα εντοπισμού σφαλμάτων επιστρέφουν την ακόλουθη έξοδο:

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

συμπέρασμα

Στη C++ ένας κατασκευαστής είναι μια συγκεκριμένη συνάρτηση μέλους που παίρνει το όνομά της από το όνομα της κλάσης με την οποία σχετίζεται. Χρησιμοποιείται για την προετοιμασία ορισμένων χρήσιμων τιμών για τα μέλη του αντικειμένου. Το σφάλμα 'No Matching Constructor for Initialization of' στη C++ αντιμετωπίζεται όταν υπάρχει σφάλμα στη δήλωση του κατασκευαστή. Συνήθως, ο μεταγλωττιστής C++ δημιουργεί ο ίδιος έναν κατασκευαστή, αλλά όταν οι κατασκευαστές δηλώνονται από τον χρήστη, τότε πρέπει να υπάρχει η σωστή δήλωση των παραμέτρων και του σώματος του κατασκευαστή για να αποφευχθεί η αντιμετώπιση τέτοιων σφαλμάτων.