2017-06-22 8 views
1

は、次のように私は、ヘッダファイルで定義されたクラスを入れ子にしていると仮定します。関数に定義を与えるために短縮メンバ関数スコープ指定子(インナークラス)(C++)

class ClassA 
{ 
    private: 
    class ClassB 
    { 
     private: 
     int member_b; 
     public: 
     void function_name(); 
    }; 
}; 

「FUNCTION_NAME()」で外部.cppファイル、私はこのようにアクセスする必要があります:私は、ネストされたクラスを使用していますなぜ、この例のために

void ClassA::ClassB::function_name() 
{ 
    std::cout << member_b; 
    return; 
} 

、聞かないでください。私は実際のプロジェクトでこれを行う理由があります。しかし、私の質問はこれです。 ClassA::ClassB::function_name()のように実装ファイル内に何らかの形でshort::function_name()のように入れ子にしておくことは可能ですか? typedefsや新しい名前空間の定義が私を助けてくれるとは思えませんが、おそらく私は間違っています。

+0

ここでtypedefを使用することができます。私の答えを参照してください。それが役に立てば幸い。 –

+0

私は言及すべきではありますが、私の例のようにClassBは依然として私的である必要があります。 typedefの使用は、ClassBが公開されていないと動作しないようです。これを達成する他の方法はありますか? – JohnTravolski

答えて

1

修飾型の名前を使用すると、修飾クラス名を表すためのtypedefを定義することができます。しかしながら

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
int outside::nested::x = 5; 
int outside::nested::f() { return 0; }; 

typedef outside::nested outnest;  // define a typedef 
int outnest::y = 10;     // use typedef with :: 
int outnest::g() { return 0; }; 

ネストされたクラス名を表すためのtypedefを使用して、次の例に示すように、その後、ネストされたクラスまたはクラスメンバを参照するためにオペレータ::(スコープの分解能)でのtypedefを使用することができ情報を隠し、コードを理解しにくくする可能性があります。

ソース:https://www.ibm.com/support/knowledgecenter/en/SSPSQF_9.0.0/com.ibm.xlcpp111.aix.doc/language_ref/cplr061.html

+0

これは機能しますが、ネストされたクラスがpublicである場合のみです。これは私が最初に考えたものではありませんでしたが、ネストしたクラスが公開されている場合にのみ可能ですか?私の例のようにプライベートで保護されていれば、これはまだ他の方法でもできますか? – JohnTravolski

+0

あなたが正しいのは、入れ子になったクラスがpublicであるときだけです。 –

+0

それで、ネストされたクラスがプライベートであるときに私が探しているものを達成する方法はありますか?私は、実装ファイル内のすべての関数定義の長い名前を短縮したいだけです。 – JohnTravolski

0

エイリアスを試しましたか?

// C++11 
using fmtfl = std::ios_base::fmtflags; 
// C++03 equivalent: 
// typedef std::ios_base::fmtflags fmtfl; 

fmtfl fl_orig = std::cout.flags(); 
fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex; 
// ... 
std::cout.flags(fl_hex); 

コードソース:https://msdn.microsoft.com/en-us/library/dn467695.aspx

+0

ネストされたクラスがプライベートであるため、これが機能するとは思われません。または私は間違っていますか? – JohnTravolski

関連する問題