2011-11-28 15 views
9

クラススコープでtypedefを宣言するのは悪い習慣ですか?誰もそのファイルを含んでいないことを確認し、同じ名前のものを作成するために、すべての関数に対してそれらを宣言する方が良いでしょうか?このタイプを使用する多くの機能があるいくつかのクラスのようにクラススコープtypedef悪い練習ですか?

typedef std::vector<int>::size_type vec_int; 

例えば

は私のヘッダーの一部で有用であろうが、一方で私は、ヘッダーに入れなければならないだろう、wouldn私は?または、ソースファイルの先頭に置くことができますか?

+0

私はあなたがなぜ尋ねているのか分かりません。聞いたことがありますか? –

+0

ハハ、何?それは歌からですか? – SirYakalot

+0

あなたの例にtypedefはありません... – interjay

答えて

13

私は、スコープを最小限にとどめています。それと、何が一番きれいなものであれ。

1つの関数に使用する場合は、その関数のスコープ内に保持します。いくつかの関数に使用する場合は、それをprivate型typedefにしてください。そして、他の人がそれを使うことを期待しているなら(おそらく実用性に欠けます)、それを公開してください。コードで

namespace detail 
{ 
    // By convention, you aren't suppose to use things from 
    // this namespace, so this is effectively private to me. 

    typedef int* my_private_type; 
} 

void some_func() 
{ 
    // I am allowed to go inside detail: 
    detail::my_private_type x = 0; 

    /* ... */ 
} 

void some_other_func() 
{ 
    // I only need the typedef for this function, 
    // so I put it at this scope: 
    typedef really::long::type<int>::why_so_long short_type; 

    short_type x; 

    /* ... */ 
} 

typedef int integer_type; // intended for public use, not hidden 

integer_type more_func() 
{ 
    return 5; 
} 

class some_class 
{ 
public: 
    // public, intended for client use 
    typedef std::vector<int> int_vector; 

    int_vector get_vec() const; 

private: 
    // private, only for use in this class 
    typedef int* int_ptr; 
}; 

うまくいけば、あなたに私が何を意味するかのアイデアを提供します。

+0

これは、インクルードディレクティブの下の実装ファイルの先頭に置くことさえ正当ですか?プライベートメンバーは良い解決策です、私は可能性について興味があるだけです。 – SirYakalot

+1

@SirYakalot:はい、それはファイルスコープ(グローバル)です。自由な関数のプライベートなtypedefをエミュレートしたいのであれば、クライアントがアクセスするはずのない 'detail'ネームスペースを持つのが普通です。 – GManNickG

+0

あなたは何がより良い練習であると思いますか?私的なメンバーですか、それともソースの一番上に置いていますか? – SirYakalot

11

クラススコープのtypedefは完全に上手く、クラススコープ外のものと競合することはできません。

標準ライブラリは、クラススコープのtypedef(value_typepointerreferenceiteratorconst_iteratorなどなど)でチーミングされています。

関連する問題