Ez a cikk a C++ programozási nyelv kétértelmű hibáival foglalkozik. A kétértelmű helyzet akkor jelenik meg, ha a fordító nem tudja meghatározni a különböző feladatokhoz használandó metódusokat vagy operátorokat. Néha ugyanazt a paraméterfüggvényt használjuk ugyanazzal a névtérrel, majd mindkét esetben cout van megadva. Amikor végrehajtjuk a programot, a fordító a cout kétértelmű hibát generálja, mivel a fordító nem érti, hogy ez a kód melyik jelentést mutatja. A cout kétértelműség akkor merül fel, ha ütközés van a programon belül a definiált névterek vagy a függvények többszörös deklarációi között.
1. példa:
Ez egy példa a cout kétértelmű hibára, amely többnyire a C++ programozásban fordul elő. Itt látni fogjuk, hogy a fordító hogyan generálja a kétértelmű hibákat a coutnál, ha több névteret használunk. A példa kódrészletét a következőkben említjük:
#include
névtér laptop {
üres kijelző ( ) {
std :: cout << 'ez a laptop névtér' << std :: endl ;
}
}
névtér Mobil {
üres kijelző ( ) {
std :: cout << 'ez a mobil névtér' << std :: endl ;
}
}
int fő- ( ) {
segítségével névtér laptop ;
segítségével névtér Mobil ;
kijelző ( ) ;
Visszatérés 0 ;
}
Itt vettünk egy programot két névtérrel, amelyeket igényünk szerint határoztunk meg. A karakterláncokat szeretnénk megjeleníteni a képernyőn. Ennek a kódnak a kimenete az alábbiakban található:
A kód végrehajtása során a hiba generálódik a cout kétértelmű helyzet miatt. A hiba azért keletkezik, mert amikor a fordító beolvassa a kódot, a fordító nem kap egyértelmű bemenetet a felhasználótól. A kódunkban több névtér-deklarációt használtunk. A teljes kódban a „display” módszert kizárólag a kimenet képernyőn való megjelenítésére használtuk. A fordítónak fogalma sincs, hogy melyik megjelenítési metódus melyik névtérhez kapcsolódik. A kódot egyszerűvé és áttekinthetővé kell tennünk, hogy a fordító könnyen megértse a lépéseket anélkül, hogy a kód kétértelművé válna.
A hiba megoldása az, hogy a fő függvényben egy kapcsolódó névtérrel hívjuk meg a metódust, hogy a fordító jobban megértse. A fő végrehajtási részben egyértelműen meghatározzuk, hogy a névtér melyik metódusát szeretnénk meghívni.
#includenévtér laptop {
üres kijelző ( ) {
std :: cout << 'ez a laptop névtér' << std :: endl ;
}
}
névtér Mobil {
üres kijelző ( ) {
std :: cout << 'ez a mobil névtér' << std :: endl ;
}
}
int fő- ( ) {
segítségével névtér laptop ;
segítségével névtér Mobil ;
laptop :: kijelző ( ) ;
Visszatérés 0 ;
}
Itt csak összekapcsolhatjuk a display() metódust a „laptop” névtérrel a fő függvényben, ahogy az előző képernyőképen is látható. Most futtassa a programot. A kimenet megjelenik a konzol ablakában.
2. példa:
Ez a forgatókönyv a C++ kód kétértelmű hibájához kapcsolódik. A fordító hibát jelez, ha nem érti a végrehajtási folyamatot. A példa kódrészlete az alábbiakban található:
#includenévtér Clanguage {
üres nyomtatás ( int én ) {
std :: cout << 'C nyelv névtere: ' << én << std :: endl ;
}
}
névtér Jáva {
üres nyomtatás ( int j ) {
std :: cout << 'Java nyelv névtere: ' << j << std :: endl ;
}
}
segítségével névtér Clanguage ;
segítségével névtér Jáva ;
int fő- ( ) {
nyomtatás ( 5 ) ;
Visszatérés 0 ;
}
Ebben a kódban meghatározzuk az összes szükséges könyvtári fejlécet. Két névteret hozunk létre különböző célokra. A „Clanguage” névtérben definiálunk egy „print” metódust, amely az egész értéket veszi át a felhasználótól. A „print” funkcióban azt az értéket szeretnénk megjeleníteni, amelyet a felhasználó a konzol képernyőjén adott át. A szükséges kimenetet a kódunkban található „cout” stream segítségével jelenítjük meg. Ezt követően meghatározunk egy másik névteret, amelynek neve „Java”.
Ebben a „Java” névtérben ismét a „print” módszert használjuk annak az értéknek a megjelenítésére, amelyet a felhasználó a „cout” szóval ad át. Mindkét névteret meghívjuk a fő függvényünkben, hogy megkapjuk a kívánt kimenetet a konzolablakban C++ nyelven. A „main” függvényben a „print()” túlterhelt függvényt hívjuk meg, hogy megjelenítsük az átadott értéket a konzol képernyőjén.
Kattintson a „végrehajtás” lehetőségre a főmenüben, és válassza a „fordítás és futtatás” opciót. A kétértelműségre vonatkozó hiba a kód végrehajtása során jelentkezik. A hiba képernyőképe az alábbiak szerint mellékelve:
Ez a hiba azt jelzi, hogy a fordító össze van zavarodva a meghívott túlterhelt print() függvény miatt. Ez a hiba a 19. „nyomtatás (5)” sorban található. A fordító össze van zavarodva azzal a névtérrel kapcsolatban, amelyhez ez a túlterhelt függvény tartozik. A kezdők az idő nagy részében mindig beleragadnak az ilyen típusú hibákba.
Oldjuk meg ezt a hibát, amely valójában nem bonyolult. A kétértelmű hibák könnyen kijavíthatók. Meg kell adnunk a névteret a túlterhelt függvény mellett a „fő” függvényben a fordító láthatósága és megértése érdekében. Akárcsak ebben a programban, hozzáadjuk ezt a „java::print(5)”-t a meglévő kódunkhoz, amint azt a következőkben említettük:
#includenévtér Clanguage {
üres nyomtatás ( int én ) {
std :: cout << 'C nyelv névtere: ' << én << std :: endl ;
}
}
névtér Jáva {
üres nyomtatás ( int j ) {
std :: cout << 'Java nyelv névtere: ' << j << std :: endl ;
}
}
segítségével névtér Clanguage ;
segítségével névtér Jáva ;
int fő- ( ) {
Jáva :: nyomtatás ( 5 ) ;
Visszatérés 0 ;
}
Most a program tökéletesen lefut minden félreérthető hiba nélkül, és megjeleníti a kimenetet a konzol képernyőjén. A program kimenete az alábbiakban található:
3. példa:
Ez az utolsó és utolsó példa egy kétértelmű probléma miatt generált hibára. A fordító nem kapja meg a megfelelő eredményt. A példa kódrészletét az alábbiakban csatoljuk, hogy a felhasználó jobban megértse:
Itt meghatározzuk a szükséges könyvtárakat. Ezt követően definiálunk egy névteret, amely tartalmazza azt az osztályt, amelyben a stringet meg akarjuk jeleníteni a konzolablakban. Ezt a definiált névteret a „main” függvényben a „c” változóval hívjuk. Ezt követően egy névtér objektum segítségével hívjuk meg a print() metódust. A metódushívás után ismét megjelenítjük a karakterláncot a konzol képernyőjén. A kimenetnek mindkét karakterláncnak kell lennie, és meg kell jelennie a konzol képernyőjén. Amikor ezt a kódot végrehajtjuk, a hiba az alábbiak szerint történik:
#includesegítségével névtér std ;
névtér myNamespace {
osztály cout {
nyilvános :
üres nyomtatás ( ) {
cout << 'Egyedi kivitel' << std :: endl ;
}
} ;
}
int fő- ( ) {
myNamespace :: cout c ;
c. nyomtatás ( ) ;
cout << 'Helló Világ!' << std :: endl ;
Visszatérés 0 ;
}
A fordító nem azt a cout utasítást választotta, amely az adatokat a konzol képernyőjén jeleníti meg. A fordító nem tudja megérteni a cout utasításhoz tartozó névteret, és hibát generál. A hiba megoldása egy névtérobjektum hozzáadása cout utasítással a fordító olvashatósága és megértése érdekében. Adja hozzá az „std::” kifejezést a cout utasításhoz, és futtassa a kódot. A következő kimenet jelenik meg a konzol képernyőjén:
Következtetés
Itt azt mondhatjuk, hogy egy kimenet megjelenítése a konzol képernyőjén olyan hibát is generál, amely nem szintaktikai és nem logikai hiba. Legtöbbször a felhasználó jól értelmezi a kódot, de ez nem érthető a fordító számára. A fordító félreérthető a bemenettel kapcsolatban. Tehát tisztázza a kód minden lépését megfelelő névtérrel és szintaxissal, hogy elkerülje a C++ programozási nyelv hibáit. A probléma megoldásának lépései az explicit minősítők használata, a névterek ütközésének megakadályozása, valamint annak biztosítása, hogy a kívánt funkciók vagy objektumok azonosítsák a probléma megoldásának lépéseit.