Som nováčikom v C ++ a potrebujem pomoc.
Chcem vytvoriť šablónu class
/struct
že rukoväte HANDLE
a ďalšie WINAPI
s zatiaľ je tento kód:
template <typename type_to_open, typename returntype, returntype (WINAPI * GlobalFn)(
type_to_open )> class Handle_Wrap {
public:
type_to_open data;
Handle_Wrap (type_to_open in_data) { data = in_data; }
~Handle_Wrap() { returntype (WINAPI * GlobalFn)( type_to_open );}
};
Handle_Wrap <HANDLE, BOOL, ::FindClose> hFind ( FindFirstFileA (pattern.c_str(), &ffd) );
Úprimne si nemyslím, že jeho fungovanie a kompilátor mi dávajú varovanie:
warning C4101: "GlobalFn" : unreferenced local variable
Videl som tento kód z webu a vykonal som v ňom určité zmeny. Neviem, či je to správny spôsob, ako to urobiť?
odpovede:
1 pre odpoveď č. 1Problém je vo vašom deštruktore. Vyhlásenie zopakujete z GlobalFn
, skôr ako to nazvať. To by malo byť:
~HandleWrap() { (*GlobalFn)( data ); }
Tiež by ste chceli, aby táto trieda bola kopírovateľná,hnuteľné alebo ani jedno? Ak ani jeden, mali by ste podniknúť kroky na zabránenie niektorému z nich príslušné predvolené hodnoty generované kompilátorom; inak budete potrebovať poskytnúť zodpovedajúce konštruktory (a prípadne i operátorov priradenia). Ak je možné kopírovať, budete tiež potrebovať nejaký druh počítadla, zdieľané medzi všetkými kópiami, takže iba posledný deštruktor uvoľní rukoväť. Pre pohyblivé (pravdepodobne najlepšie riešenie, ak môžete si byť istí, že máte C ++ 11), potrebujú pohyb konštruktor, ktorý robí niečo, aby zabezpečili, že deštruktor presunutého z objektu je ne-op.
0 pre odpoveď č. 2
Ako sa používa štandard unique_ptr
std::unique_ptr<HANDLE, ::FindClose> hFind = FindFirstFileA(...);
(Alebo niečo podobné).
Mám podozrenie, že vo vašom kóde je problém, že kompilátor ho nevidí GlobalFn
ako volanie funkcie, ale ako protoptyp (ďalšie „víťazstvo“ pre Most Vexing Parse) - nemali by ste ich používať WINAPI
vôbec to urobte z ukazovateľa funkčných šablón:
trieda šablón Handle_Wrap { ... ~ Handle_Wrap () {GlobalFn (data); } };
Pravdepodobne budete tiež chcieť použiť add operator type_to_open() { return data; }
, aby ste mohli používať FindNextFile(hFind, ...)
, namiesto toho, aby ste sa museli spoľahnúť data
byť verejný.