2011-12-15 18 views
7

イニシャライザリストに多くの名前空間があり、を使用してを使用して冗長性を減らしたいと考えています。しかし、初期化子リストはコンストラクタの中括弧の範囲外ですので、コンストラクタの外側にを使用してを配置し、ファイルの残りの部分を汚染する必要があります。私が望むように使用範囲を設定する方法はありますか?むしろより:イニシャライザリストの名前空間を使用

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

私がしたい:

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

_

+1

どのような言語ですか?適切なタグを付けてください。 –

+0

申し訳ありませんトマシュ、コメントに感謝します。 C++タグを追加するように編集しました。 – Ant

+1

C++の文法要素 "initializer-list"は何か(集約初期化子の '{} 'の間の部分)なので、混乱を避けるため、" ctor-initializer "と呼ぶべきです。そして、それを使用してファイルの残りの部分を「汚染」するのはどうなのですか?それはあなたの.cxxファイルであり、ヘッダーではありません。もう一つの選択肢は、 'nsConstants :: ONE;'を使うことですが、あなたが望むものはできません。 – PlasmaHH

答えて

4

できません。 最も汚染に少なくとも汚染から、

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

:標準は、いくつかのあまり良い選択肢を提供しています。

typedef

は、あなたのクラス定義の privateセクションでそのエイリアスを書くことを可能にする:

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

しかし、あなたはまた、ユニット・グローバルそれを使用することができますが、チャンスでそれをリネームする:

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

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

することもできますエイリアスの名前空間:

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

ただ、完全を期すために、最も汚染ソリューションはusing namespaceです:それとも、桜、あなたのFrobは、翻訳のあなたのユニット内の別のFrobと衝突する可能性が不利で、他の名前空間からのシンボルを選ぶことができます。

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

注意III、IVおよびVはまた、シュバルツシルト-の例のように、あなたのCXXファイルに限定することができます。

+0

非常に完全な答えをお寄せいただきありがとうございます。私はI、II、IVで多くの追加コードを意味する名前空間に多くの型を持っています。 IIIは名前空間を短くしますが、私の場合はすでに短いですし、Vは避けたいものです。この場合、私は元のコードに固執します。 – Ant

0

これは明らかに不可能です。 C++には "local using"のようなものは存在しません。したがって、スコープ演算子に固執するか、usingを使用する必要があります。

+0

>> C++で "local using"のようなものはありません。 まあ、私は次のような意味です: void myFunction() { using namespace nsConstants; i = ONE; } これはC++にあります。詳細は、stackoverflowの他の多くの項目を参照してください。 (申し訳ありませんが、私はコードとしてこれをフォーマットすることはできません) – Ant

関連する問題