Gå til innhold

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


Anbefalte innlegg

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

Videoannonse
Annonse
Skrevet (endret)

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
Skrevet (endret)
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
Skrevet

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

Skrevet

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

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.

Skrevet
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");

}

Skrevet
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.

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...