Ernie Skrevet 19. april 2005 Skrevet 19. april 2005 Men du skal være veldig forsiktig med er å bruke using i header-filer. Hvorfor det egentlig? Har funnet ut at det må brukes fra tid til annen (fjernet et par komplatorfeil), men når MÅ man bruke det og når bør man ikke? Hva kan man bruke i stedet?
A_N_K Skrevet 19. april 2005 Skrevet 19. april 2005 (endret) Jeg kan ikke komme på noen tilfeller hvor du må bruke using, det er simpelthen en snarvei for å unngå å prefikse med namespacet. Det er uansett regnet for dårlig stil å bruke using i header-filer siden det forurenser det globale navnerommet, i hver enkelt kildefil er det mer opptil hver og en. Edit: eksessiv negasjon igjen :| Endret 19. april 2005 av A_N_K
☀ ❄ Skrevet 19. april 2005 Skrevet 19. april 2005 (endret) Jeg kan ikke komme på noen tilfeller hvor du må bruke using, det er simpelthen en snarvei for å unngå å prefikse med namespacet. Jeg vil gjerne understreke at A_N_K med det mener at det ikke finnes noen situasjoner hvor du må bruke using for å inkludere et namespace i en headerfil. Han mener ikke at han er så vimsete at han har glemt i hvilke tilfeller det er Kort sagt: Bruk namespace-prefikset i headerfiler. Alltid. Edit: La til for å inkludere et namespace Endret 19. april 2005 av Myubi
A_N_K Skrevet 19. april 2005 Skrevet 19. april 2005 Som tommelfingerregel sier jeg meg aldri 100% sikker
kjetil7 Skrevet 19. april 2005 Skrevet 19. april 2005 Hehe.. det finnes vel ikke noen regel uten unntak... Hva med denne kodesnutten: main.h class x { public: void a(int d) { } }; class y : public x { public: void a(char*b, char*c) { } }; main.cpp: int main() { y yp; yp.a(1); } Forslag?
☀ ❄ Skrevet 19. april 2005 Skrevet 19. april 2005 Forslag? class x { public: void a(int d) {} }; class y : public x { public: void a(char* b, char* c) {} using x::a; }; Men i dette tilfellet er det ikke snakk om å inkludere et namespace. Uansett, jeg ser poenget ditt, og redigerer ordlyden i posten min
kjetil7 Skrevet 19. april 2005 Skrevet 19. april 2005 Ja, jeg vet at jeg kanskje trakk den litt langt ... . Men jeg bare måtte .
knuto Skrevet 20. april 2005 Skrevet 20. april 2005 Dersom eg har oppfatta det heile rett er grunnen til at du ikkje skal bruke using i ei headerfil enkelg og greit at dette då vil bli used i alle andre headerfiler og C++-filer. Dersom du har using namespace std; i ei headerfil vil du ikkje kunne "unngå å use / bruke" dette namespacet i dine C++-filer i prosjektet, noko som kan lage feil eller missforståelsar. (rett?)
☀ ❄ Skrevet 20. april 2005 Skrevet 20. april 2005 Ikke helt, men nesten. Dersom du bruker en using-deklarasjon i en headerfil vil den identifikatoren bli gjort tilgjengelig i samme skop som du har deklarasjonen på alle steder headerfilen blir inkludert. Eksempel: using std::cout; class my_class { public: using std::cin; protected: using std::vector; private: using namespace std; }; std::cout vil bli globalt tilgjengelig i alle filer som inkluderer headerfilen. std::cin vil bli tilgjengelig som my_class::cin i alle filer som inkluderer headerfilen. std::vector vil bli tilgjengelig lokalt i my_class, samt lokalt i alle klasser som arver my_class. namespace std vil bli tilgjengelig lokalt i my_class.
hishadow Skrevet 21. april 2005 Skrevet 21. april 2005 Jeg kan ikke komme på noen tilfeller hvor du må bruke using, det er simpelthen en snarvei for å unngå å prefikse med namespacet. Jeg vil gjerne understreke at A_N_K med det mener at det ikke finnes noen situasjoner hvor du må bruke using for å inkludere et namespace i en headerfil. Han mener ikke at han er så vimsete at han har glemt i hvilke tilfeller det er Kort sagt: Bruk namespace-prefikset i headerfiler. Alltid. Edit: La til for å inkludere et namespace Så litt i tcpl se (s.181)... Gitt du har to namespace A og B som definerer en String klasse hver... og du skriver koden... #include <A> #include <B> using namespace A; using namespace B; void test() { String test("en string"); } ... løsningen for å fikse navnkræsj ved f.eks. å velge A var ... #include <A> #include <B> using namespace A; using namespace B; using A::String; void test() { String test("en string"); }
☀ ❄ Skrevet 21. april 2005 Skrevet 21. april 2005 Så litt i tcpl se (s.181)... Gitt du har to namespace A og B som definerer en String klasse hver... og du skriver koden... #include <A> #include <B> using namespace A; using namespace B; void test() { String test("en string"); } ... løsningen for å fikse navnkræsj ved f.eks. å velge A var ... #include <A> #include <B> using namespace A; using namespace B; using A::String; void test() { String test("en string"); } Men nå var det snakk om headerfiler.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå