Fråga angående funktions parametrar i C++

Permalänk

Fråga angående funktions parametrar i C++

Tjena! Jag försöker få en lite bättre förståelse för hur man kan utnyttja parametrar i en funktion.

Jag satt nyligen höll på lite med <fstream> biblioteket och upptäckte att när man anger:

ofstream fil1 (filePath); //eller ifstream fil2 (filePath);

Så har man även möjlighet att ge en del andra parametrar som:

ios:app ios:ate ios::binary ios:in ios:out ios::_Nocreat ios::_Noreplace ios::trunc

Jag förstår att om inga av ios:: parametrarna anges kommer standard parametrarna till respektive stream användas, men så fort man anger en av ios:: parametrarna så överskrider den standarden. Saken som jag är intresserad av är att man har möjlighet att ange flertal av ios:: parametrarna och möjligheten att ange dem i vilken ordning man vill.

Om jag nu skulle vilja använda dessa egenskaper i mina funktions parametrar hur går jag tillväga? Någon som kan peka mig i rätt riktning för att hitta mer om detta?

Om jag inte fått fram min fråga på ett tolkbart sätt får ni gärna uppmärksamma mig så ska jag försöka förtydliga.

Permalänk
Medlem

Det är typ bit-wise flaggor.

exempel:

void minFunktion(int flags) { int arg1 = 1; // första biten int arg2 = 2; int arg3 = 4; int arg4 = 256 // 9'onde bit-en if( flags & arg1 == arg1) // Detta betyder att (00100101 & 00000001) == 00000001\ // ..eftersom sista ettan finns på båda argumenten { // Gör något } // if( etc.... }

Sen så kan du göra det där med en switch istället för if osv. Sök på bitwise operators för att hitta mer.
Sedan så kör man defines med fina namn istället för bara siffror sådär.

Permalänk

Som sades tidigare så är dessa flaggor "bit masks". Och de OR:as ihop för att kombinera dem till ett argument.

std::ios_base::openmode myMode = ios:app | ios:ate | ios::binary;

Och det kommer inte spela någon roll vilken ordning du OR:ar ihop dem (om du inte gör något obskyrt) myMode kommer bli detsamma.

// i main.cpp #include <cstdint> #include <iostream> // Ett sätt att skapa sina värden på. namespace MyNamespace { typedef std::uin32_t MyMode; const MyMode MY_MODE_1 = 1; const MyMode MY_MODE_2 = 2; const MyMode MY_MODE_3 = 4; // litet försök att undvika duplicering av kod void PrintIfTrue(bool condition, const std::string & message) { if(condition) { std::cout << message << std::endl; } } void PrintBitMasks(const MyMode & mode) { // Kolla om användaren har tagit med MY_MODE_1 PrintIfTrue(((MY_MODE_1 & mode) == MY_MODE_1), "MY_MODE_1"); // Kolla om användaren har tagit med MY_MODE_2 PrintIfTrue(((MY_MODE_2 & mode) == MY_MODE_2), "MY_MODE_2"); // Kolla om användaren har tagit med MY_MODE_3 PrintIfTrue(((MY_MODE_3 & mode) == MY_MODE_3), "MY_MODE_3"); } } int main(int argv, char ** argc) { // Ett sätt att göra det på. MyNamespace::MyMode mode = MyNamespace::MY_MODE_2 | MyNamepace::MY_MODE_3; MyNamespace::PrintBitMasks(mode); // Ett annat sätt att göra det på. MyNamespace::PrintBitMasks(MyNamespace::MY_MODE_1 | MyNamepace::MY_MODE_3); return 0; }

Så här borde det fungera att göra om jag inte har gjort några tabbar såhär på morgonkvisten innan första kaffet. Hoppas det hjälper.

Permalänk

Tack för de snabba svaren!
Har kollat in bit-masks och har helt klart fått en bättre förståelse för hur saker och ting fungerar. Hade även en liten dold agenda bakom frågan, vilket var att se om jag kunde implementera en liknande egenskap i mitt program jag håller på att bygger. Med hjälp av era svar så insåg jag att bit-mask inte fungerade för det jag försöket göra, men på grund av var jag letade om bit-masks kom jag över lite annan information som höll en potentiell lösning. Efter ytterligare informations sökning kom jag på att även om den lösningen hade funkat hade det vart jobbigt att programmera och jobbigt för användaren att använda, så tänkte om hela approachen och kom på något helt nytt som var mycket enklare och mer standard.

Så ni har definitivt vart hjälpsamma och jag tackar hemskt mycket!