Hogyan lehet megoldani a „No Matching Constructor for Initialization of” hibát a C++ nyelven

Hogyan Lehet Megoldani A No Matching Constructor For Initialization Of Hibat A C Nyelven



A C++-ban a konstruktor egy adott tagfüggvény, amely a nevét annak az osztálynak a neve után veszi, amelyhez kapcsolódik. Az objektum tagjai számára néhány hasznos érték inicializálására szolgál. Ha a konstruktort nem a felhasználó határozza meg, a C++ fordító létrehoz egy alapértelmezett konstruktort, és nem vár paramétereket és üres törzset. Ha azonban van egy felhasználó által definiált konstruktor, akkor annak törzsét és paramétereit deklarálni kell.

Mi okozza a „Nincs egyező konstruktor az inicializáláshoz” hibát a C++-ban?

Amikor C++-ban konstruktorokkal foglalkozunk, a „No Matching Constructor for Initialization of” hibával szembesülünk, ez általában azért van, mert amikor a fordító egy konstruktort hív, az alapértelmezett konstruktor nem jön létre, ezért magának kell deklarálnia a konstruktor paramétereit és törzsét. A megfelelő paraméterek deklarálásának elmulasztása ilyen típusú konstruktori hibát eredményez.







Hozzon létre egy egyszerű szöveges fájlt, illessze be a Square() függvény kódját, és mentse el .h kiterjesztéssel. Most illessze be ezt a fájlt a CPP-fordító bin mappájának include mappájába. Most, amikor meghívja ezt a fejlécfájlt a main.cpp-ben, ezt a fájlt beolvassa a fordító.



Square.h fejlécfájl

#ifndef SQUARE_H

#define SQUARE_H


osztály Négyzet {

magán :

kettős hossz ;

kettős szélesség ;

nyilvános :

Négyzet ( kettős , kettős ) ;

kettős getLength ( ) const ;

kettős getWidth ( ) const ;

} ;



Négyzet :: Négyzet ( kettős l, kettős Ban ben ) {

hossz = l ;
szélesség = Ban ben ;

}



kettős Négyzet :: getWidth ( ) const { Visszatérés szélesség ; }

kettős Négyzet :: getLength ( ) const { Visszatérés hossz ; }



#endif

main.cpp fejlécfájl

#include

#include 'négyzet.h'

segítségével névtér std ;



int fő- ( )

{

Négyzet alakú doboz 1 ( 10.0 , 10.0 ) ;

Négyzet alakú doboz 2 ;



cout << ' az 1. mező szélessége és hossza: ' << doboz1. getWidth ( ) << ', ' << doboz1. getLength ( ) << endl ;

cout << ' a 2. mező szélessége és hossza: ' << doboz2. getWidth ( ) << ', ' << doboz2. getLength ( ) << endl ;



doboz2 = doboz1 ;

cout << 'Amikor az 1. négyzet négyzet egyenlő a 2. négyzetméterrel' << endl ;

cout << ' az 1. mező szélessége és hossza: ' << doboz1. getWidth ( ) << ', ' << doboz1. getLength ( ) << endl ;

cout << ' a 2. mező szélessége és hossza: ' << doboz2. getWidth ( ) << ', ' << doboz2. getLength ( ) << endl ;



Visszatérés 0 ;

}

Ebben a programban a felhasználó beírja két négyzet alakú négyzet hosszát és szélességét, majd egyenlővé teszi a két négyzetet, és visszaadja a hosszukat és szélességüket:




A fordító a 14. sorban lévő hibát adja vissza, mert a vállalkozó két argumentumot vár, miközben nincs argumentum hozzá:





A 8. sorban a fordító hibát ad vissza a konstruktorban, mert az argumentumok nincsenek megadva, miközben meg kell lenniük a meghatározott argumentumoknak.

Hogyan lehet megoldani a „No Matching Constructor for Initialization of” hibát a C++ nyelven

A fordító a hibát a main.cpp kód 8. sorában jeleníti meg, mert a Square alapértelmezett konstruktorát próbálták meghívni. A fordító nem tud alapértelmezett konstruktort generálni, mert van már egy felhasználó által definiált konstruktor, amely két argumentumot vesz fel. Ezért a paramétereit a következőképpen adja meg:



Négyzet alakú doboz 2 ( 0 , 10 ) ;

A fordító csak akkor hoz létre alapértelmezett konstruktort, ha nem rendelkezik felhasználó által definiált konstruktorral. Tehát ebben az esetben, ha van konstruktor definiálva, az alapértelmezett konstruktort a felhasználónak kell megadnia. Tehát ehhez adjon meg alapértelmezett argumentumokat a Square.h fájl kétargumentumos konstruktorában is. Ez nem hagyja inicializálatlanul az adatokat.

Négyzet :: Négyzet ( kettős l = 0 , kettős Ban ben = 0 )

A konstruktor hiba a konstruktor és paramétereinek megfelelő meghívásával és deklarálásával javítható. A main.cpp és a Square.h kódjai a fenti utasításoknak megfelelően módosulnak. És a nem egyező konstruktor hiba megoldódott. Ez a fejlécfájl frissített kódja:

Ez a főfájl frissített kódja:

A fenti kódok a hibakeresési hibák után a következő kimenetet adják vissza:

Két négyzet alakú négyzet szélességét és hosszát a felhasználó adja meg, és ezek paramétereit adja vissza. Később egy feltételt alkalmazunk, hogy mindkét doboz egyenlő legyen, majd a megfelelő új hossz- és szélességértékek kerülnek visszaadásra.

Következtetés

A C++-ban a konstruktor egy adott tagfüggvény, amely a nevét annak az osztálynak a neve után veszi, amelyhez kapcsolódik. Az objektum tagjai számára néhány hasznos érték inicializálására szolgál. A „No Matching Constructor for Initialization of” hibával a C++-ban akkor kell szembesülni, ha hiba van a konstruktor deklarációjában. Általában a C++ fordító maga generál egy konstruktort, de amikor a konstruktorokat a felhasználó deklarálja, akkor meg kell adni a paraméterek és a konstruktor törzsének megfelelő deklarációját, hogy elkerüljük az ilyen hibákat.