2011-12-15 20 views
7

Mam dużo wykorzystania przestrzeni nazw na liście inicjalizacyjnej i chciałbym przy użyciu przestrzeni nazw, aby zmniejszyć szczegółowość. Jednak lista inicjalizacyjna jest poza zakresem nawiasów konstruktora, więc musiałbym umieścić za pomocą poza konstruktorem i zanieczyścić resztę pliku. Czy istnieje sposób na zakres używania, jak chcę? Zamiast:Używanie przestrzeni nazw tylko dla listy inicjatorów

MyClass::MyClass() : 
    m_one(nsConstants::ONE), 
    m_two(nsConstants::TWO), 
    m_three(nsConstants::THREE) 
{} 

chcę:

MyClass::MyClass() : 
    using namespace nsConstants; 
    m_one(ONE), 
    m_two(TWO), 
    m_three(THREE) 
{} 

_

+1

Jaki to jest język? Proszę odpowiednio oznaczyć. –

+0

Przepraszam Tomasz, i dziękuję za komentarz. Edytowane w celu dodania tagu C++. – Ant

+1

Aby uniknąć nieporozumień, należy go nazwać "ctor-initializer", ponieważ element gramatyki C++ "initializer-list" jest czymś innym (część między '{}' dla inicjatorów agregujących). A co jest tak złego w "zanieczyszczaniu" reszty pliku przy użyciu? To jest twój plik .cxx, a nie nagłówek, więc powinno być dobrze. Inną opcją byłoby zrobienie 'using nsConstants :: ONE;', ale to, czego chcesz, nie jest możliwe. – PlasmaHH

Odpowiedz

4

Nie możesz. Standardowo oferuje kilka mniej dobre alternatywy:

// The stuff you want to use. 
namespace foo { namespace bar { 
    class Frob {}; 
} } 

Teraz z najmniej zanieczyszczających do najbardziej zanieczyszczających.

typedef umożliwia napisać, że alias w private sekcji definicji klasy:

// I) 
class Schwarzschild { 
      typedef foo::bar::Frob FbFrob; 
public: Schwarzschild() : a(FbFrob()), b(FbFrob()) {} 
private: FbFrob a,b,c; 
}; 

Ale można też użyć go unit-globalnie, ale z szansą na jego nazwę:

// II) 
class Schwarzschild { 
public: Schwarzschild(); 
private: foo::bar::Frob a,b,c; 
}; 

// cxx-file 
typedef foo::bar::Frob FbFrob; 
Scharzschild::Scharzschild() : a(FbFrob()) {} 

można również nazw alias:

// III) 
namespace fb = foo::bar; 
class Planck { 
public: Planck() : a(fb::Frob()), b(fb::Frob()) {} 
private: fb::Frob a,b,c; 
}; 

Albo można wybrać wiśnia symboli z innych nazw, z wadą, że Frob może zderzyć się z innym Frob w swojej jednostce tłumaczenia:

// IV) 
using foo::bar::Frob; 
class Mach { 
public: Mach() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

Tylko dla kompletności wywodu, najbardziej zanieczyszczające rozwiązaniem jest using namespace.

// V) 
using namespace foo::bar; 
class Newton { 
public: Newton() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

Należy zauważyć, że III, IV i V można również ograniczyć do pliku cxx, jak w przykładzie Schwarzschilda.

+0

Dziękuję za bardzo kompletną odpowiedź phresnel, mam wiele typów w przestrzeni nazw, co oznaczałoby dużo dodatkowego kodu w I, II i IV. III skraca przestrzeń nazw, ale w moim przypadku jest już krótka i V jest tą, której chcę uniknąć. W tym przypadku trzymam się mojego oryginalnego kodu. – Ant

0

Nie jest to oczywiście możliwe. Nie ma czegoś takiego jak "lokalne użycie" w C++. Musisz więc trzymać się operatora zasięgu lub użyć using.

+0

>> Nie ma czegoś takiego jak "lokalne użycie" w C++. Cóż miałem na myśli: void myFunction() { przy użyciu przestrzeni nazw nsConstants; i = ONE; } , który znajduje się w C++. Zobacz więcej informacji na temat stackoverflow. (Niestety, nie mogę sformatować tego jako kodu.) – Ant

Powiązane problemy