2011-12-15 13 views
7

Bir başlatıcı listesinde çok fazla ad alanı kullanımım var ve ayrıntı alanını azaltmak için ad alanı'u kullanarak bir olmasını isterim. Ancak, başlatıcı listesi yapıcı parantezinin kapsamı dışındadır, bu yüzden 'u kurucunun dışına kullanarak yerleştirmek ve dosyanın geri kalanını onunla kirletmek zorunda kaldım. Kullanmayı istediğim gibi kullanmanın bir yolu var mı? Yerine:ad alanı sadece başlatıcı listesi için

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

istediğim:

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

_

+1

Hangi dildir? Lütfen uygun bir şekilde etiketleyin. –

+0

Üzgünüm Tomasz, ve yorum için teşekkürler. C++ etiketi eklemek için düzenlenmiştir. – Ant

+1

Karışıklığı önlemek için, C++ dilbilgisi öğesi "başlatıcı listesi" başka bir şey olduğundan ("başlatıcı başlatıcısı için" {} "bölümü olduğundan" ctor-initializer "olarak adlandırılmalıdır. Ve dosyanın kalan kısmını "kirleten" ile bu kadar kötü olan nedir? Bu sizin .cxx dosyanızdır, bir başlık değil, bu yüzden tamam olmalı. Başka bir seçenek nsConstants :: ONE; 'kullanarak yapmak, ancak istediğinizi mümkün değildir. – PlasmaHH

cevap

4

Yapamazsınız. Standart bazı az iyi alternatifler sunuyor: Artık

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

, az kirleten gelen en kirletici için.

typedef

sınıf tanımının bir private bölümünde bu takma adı yazmayı mümkün kılar:

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

Ama aynı zamanda birim küresel kullanabilirsiniz, ancak bir fırsat yeniden adlandırmak:

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

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

yapabilirsiniz ayrıca takma ad:

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

Yoksa kiraz senin Frob çevirinin Biriminizde başka Frob çarpışarak dezavantaj ile diğer ad sembolleri alabilirsiniz:

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

Sadece şeyiyle uğruna, en kirletici çözüm using namespace olduğunu.

III, IV ve V, ayrıca Schwarzschild-örnekte gibi, CXX dosya sınırlandırılabilir Not bu
// V) 
using namespace foo::bar; 
class Newton { 
public: Newton() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

.

+0

Çok kapsamlı bir cevap phresneliniz için teşekkür ederim, isim alanında çok fazla tür var. Bu, I, II ve IV'te çok fazla ek kod anlamına gelecektir. III isim alanını kısaltır ama benim durumumda zaten çok kısa ve V kaçınmak istediğimdir. Bu durumda orijinal koduma bağlı kalacağım. – Ant

0

Bu açıkça mümkün değildir. C++'da "local using" gibi bir şey yoktur. Bu yüzden, kapsam operatörüne bağlı kalmanız veya using'u kullanmanız gerekir.

+0

>> C++'da "local using" gibi bir şey yok. Demek istediğim: void myFunction() { ad alanı nsConstants; i = ONE; C++ 'da bulunan } . Ayrıntılar için stackoverflow üzerindeki diğer birçok girişe bakın. (Özür dilerim, bunu kod olarak biçimlendiremem.) – Ant