Gå til innhold

system("PAUSE"); uten "Trykk en tast..."


Anbefalte innlegg

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?

Lenke til kommentar
Videoannonse
Annonse

Jeg kan ikke komme på noen tilfeller hvor du 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 av A_N_K
Lenke til kommentar
Jeg kan ikke komme på noen tilfeller hvor du 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 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 av Myubi
Lenke til kommentar

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?

Lenke til kommentar
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 :)

Lenke til kommentar

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?)

Lenke til kommentar

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.

Lenke til kommentar
Jeg kan ikke komme på noen tilfeller hvor du 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 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");

}

Lenke til kommentar
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.

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...