[C++] Przestrzenie nazw i "wyłączenie" ich w funkc

0

Witam,

Czy jest możliwość zwolnienia z obowiązku używania operatora zasięgu do przestrzeni nazw jedynie w parametrze pewnej funkcji?

Dla przykładu kod:


namespace Space
{
      enum Constant
      {
              Constant1,
              Constant2,
              Constant3
      };
};

 class CClass
 {
       CClass(enum Constant constant)
       {
            
       };
 };

Gdzieś w wewnętrznym kodzie używam:

CClass(Space::Constant1);

Chciałbym żeby była możliwość zrobienia czegoś takiego:

CClass(Constant1);

Ale bez używania wcześniej instrukcji: "using namespace Space";

Tak żeby być zwolnionym z obowiązku używania operatora zasięgu do przestrzeni nazw Space JEDYNIE w parametrze konstruktora CClass

0

Ne da se.

0

Napisałem coś w stylu "dynamicznych stałych"
W programie miałem enum z listą kilkudziesięciu "stałych", mój problem polegał na tym, że "stałe" te zmieniały swoje wartości w zależności od wersji odczytywanego przez program pliku.

Wymyśliłem pewne rozwiązanie:
Zadeklarowałem pewną klasę, klasa ta obsługuje operator konwersji na typ int
czyli można zrobić coś takiego:

int wartoscStalej = DynamicConstant(DynamicConstant::Constant1);

Tworzy się obiekt i automatycznie wywołuję się operator konwersji, który odwala całą robotę i generuję wartośc "stałej" w zależności od wersji pliku na którym program ten operuje.

W operatorze konwersji na int jest cos takiego:

switch(constant)
{
  case Constant1:

    switch(plik->getVersion() >= 20)
     return 0x0100;
    else return 0x150;

  break;

  case Constant2:

    switch(plik->getVersion() >= 30)
     return 0x0140;
    else return 0x170;

  break;

  case Constant3:


    switch(plik->getVersion() >= 20)
     return 0x030;
    else return 0x00; // w takich wersjach pliku nie ma takiej stałej

  break;
}

Niby jest wszystko ok, problem w tym, że tych dynamicznych stałych czasami używam kilka w jednej linijce, co dość mocno psuje przejrzystość mojego kodu : P

Gdyby nie mieć obowiązku używania operatora zasięgu było by znacznie przejrzyściej, mógłbym zlikwidować tę przestrzeń nazw, ale jest jeden problem, do jakiegoś czasu te "dynamiczne stałe" były naprawdę stałe. tzn.
nie sprawdzałem wersji pliku i nie generowałem nowych wartości, tylko miałem zwykłą listę z enum z ich wartościami, używałem do tego czasu po prostu ich nazw np .

int wartoscStalej = Constant1

Aktualnie gdybym napisal takie cos jak kod powyzej to takie cos by sie skompilowalo i skonczylo dla mnie błedem niewidocznym, strasznym, trudnym do wykrycia, nie poprawna by byla wartosc stałej, dlatego wprowadzilem wlasnie przestrzen nazw, wtedy widzę DynamicConstant:: i automatycznie wiem ze nie jest to zwykla stala i moze byc uzyta tylko w parametrze konstruktora klasy DynamicConstant jako pomocnik do wygenerowania wartosci w switch
Gdyby dalo sie jakos sprawic ze danego enum mozna uzyc w konstruktorze do DynamicConstant to by ok :)

Pozdrawiam

0

using std::string; powoduje ze masz dostep do klasy std::string bez uzycia operatora zasiegu tylko uzywajac samej nazwy.

using namespace std; wewnatrz funkcji da nam dostep do std w obrebie tej funkcji ALE jako nazwe globalna - tzn. nazwa cout w funkcji przesloni cout z std nawet jesli using namespece std bylo w zakresie funkcji

winerfresh, czym autor tematu ci zawinil ze go wprowadzasz w blad?

0

Hmm. tylko, że jeśli się nie mylę to działa tylko wewnątrz funkcji, a ja chciałbym nie używać operatora zasięgu w parametrze przekazywanym do funkcji

Pozdrawiam

0

To co problem w zasięgu globalnym dać using space::name? Będziesz miał dostęp do tej nazwy w zasięgu.

0

wtedy widzę DynamicConstant:: i automatycznie wiem ze nie jest to zwykla stala i moze byc uzyta tylko w parametrze konstruktora klasy DynamicConstant jako pomocnik do wygenerowania wartosci w switch
http://www.ed-hardy-jeans-sale.net/

0

Niby jest wszystko ok, problem w tym, że tych dynamicznych stałych czasami używam kilka w jednej linijce, co dość mocno psuje przejrzystość mojego kodu : P

Gdyby nie mieć obowiązku używania operatora zasięgu było by znacznie przejrzyściej, mógłbym zlikwidować tę przestrzeń nazw, ale jest jeden problem, do jakiegoś czasu te "dynamiczne stałe" były naprawdę stałe. tzn.
http://www.uggsallboots.com

1 użytkowników online, w tym zalogowanych: 0, gości: 1