2011-09-08 11 views
19

no static classes in C++があるにもかかわらず、Javaのバックグラウンドからのものですが、Utilのような静的メソッドのみを含むヘルパークラスを作成するために使用します。これはと思われますか?または通常の練習ですか?私が見る1つの選択肢は、C関数を使用することです(クラス・コンテキストはまったくありません)。その他の選択肢は何ですか?そこには長所と短所があり、どの状況下でこれらを使用するのか。C++の静的メソッドのみを持つクラスの利点

defining bunch of static methods in c++は、クラスコンテキストを持たないstaticキーワードにどのような影響があるのか​​わかりませんが、静的関数を名前空間にすることを提案しています。

+0

リンク先のチャールズ・ベイリーの答えを読んでください。 staticはC++でフリー関数(クラスコンテキストを持たない関数)に適用すると静的なクラスメンバ関数を適用するとかなり意味が異なる – nos

答えて

22

あなたがグローバル名前空間をつかうことなく、ユーティリティ機能のコレクションを作成したい場合は、単に自分の名前空間に定期的に関数を作成する必要があります。

namespace utility { 
    int helper1(); 
    void helper2(); 
}; 

をあなたはおそらくどちらかそれらの静的関数にする必要はありません。 メンバ関数ではなく非メンバ関数のコンテキスト内で、CおよびC++のstaticキーワードは、関数のスコープを現在のソースファイルに制限するだけです(つまり、ソートすると関数がプライベートになります)。現在のファイル)。これは通常、Cで書かれたライブラリコードで使用される内部ヘルパー関数を実装するためにのみ使用され、結果として得られるヘルパー関数は他のプログラムに公開されるシンボルを持たないようになっています。 Cは名前空間を持たないので、これは名前間の衝突を防ぐために重要です。

+4

Javaから移行する場合は、適切なC++標準用語が「メンバ関数ではないメンバ関数のコンテキスト内です)」。これはあなたがその用語に従わなければならないということを意味するわけではありませんが、(私を含む)一部のC++プログラマは、「どのような言語について話していますか?誰もがC++の「メソッド」について話すたびに疑問を呈します。 –

+0

@スティーブ、それを指摘してくれてありがとう!それはあなたがそれを鳴らすほど些細なことではありません。標準的な用語が何であるかを知っていれば、特に書籍が横たわっていて、索引を使用してトピックを検索している場合に、より良い回答が得られます。つまり、多くのC++の議論では、他の多くの言語がメソッドや関数のいずれかと呼ばれることが多い関数の概念がオーバーロードされているため、別の言語で定義されている "関数"より具体的には、C++の「非メンバ関数」はかなり重要です。 –

10

C++では、のみのクラスstaticのメソッドは、ほとんどがテンプレートメタプログラミングで使用されます。

例えば、私はコンパイル時に計算フィボナッチ数に自体をしたい、と実行時に、私は彼らだけ印刷したい場合、私はこのプログラムを書くことができますが:

#include <iostream> 

template<int N> 
struct Fibonacci 
{ 
    static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value; 
    static void print() 
    { 
     Fibonacci<N-1>::print(); 
     std::cout << value << std::endl; 
    } 
}; 


template<> 
struct Fibonacci<0> 
{ 
    static const int value = 0; 
    static void print() 
    { 
     std::cout << value << std::endl; 
    } 
}; 

template<> 
struct Fibonacci<1> 
{ 
    static const int value = 1; 
    static void print() 
    { 
     Fibonacci<0>::print(); 
     std::cout << value << std::endl; 
    } 
}; 

int main() { 
     Fibonacci<20>::print(); //print first 20 finonacci numbers 
     return 0; 
} 

オンラインデモ: http://www.ideone.com/oH79u

+1

私は確かにわかりません*多くのプログラマは静的クラスを使って(より良い(?)代替は名前空間の自由な関数です)。しかし、静的メンバー関数がTMPで広く使用されているという点であなたの答えは正しいです。 –

+3

Noooo、フィボナッチの例ではない*もう一度*! :) –

+0

@Luc: '多くのプログラマーは静的クラスを使って、関連する関数のセットを論理的にグループ化していると思います。それは事実ですが、そのようなシナリオはメタプログラミングよりもむしろ少なくありません。 – Nawaz

3

C++あなたはおそらく、本当に、私はちょうどそれらの自由な機能になるだろう、全くクラスに収まらない、いくつかのutilの機能を必要とするので、もし、マルチパラダイム言語です。私は、OOPのためだけに、それらをクラスに入れる理由は見当たりません。

私はすべての機能を作ることが、無料の機能と同じように、それらを持っている以上、クラスに入れることができるという利点はありません。個人的には、自由な関数がオプションで動作する方が簡単だと思います。

+0

関数をまとめてグループ化する場合は、名前空間を使用できます。 –

+2

私は利点を知っています。あるクラスのファンクションのグループを作成したい場合は、各ファンクションではなく、クラスに入れてクラスを友人にするほうが簡単で、IMHOクリーナーです。シナリオ私は、民間のコンストラクタなどへのアクセスを必要とするファクトリメソッドであると考えています。 – tokage

0

クラス内に静的メソッドを宣言する際には、実際の問題はありません。あなたが参照している投稿に記載されている理由から、この目的のために名前空間が適しています。

命名規則を決める場合を除いて、C関数を使用すると名前の衝突が発生する可能性があります。たとえば、btFunctionA、btFunctionBなどのように関数に接頭辞を付けます。 シンボルを名前空間内に保持して、結局のところC++ではなくC言語である。

名前空間内の静的関数は、非静的関数と変わりありません。この文脈ではstaticキーワードは単に無視されると私は信じています。

0

C++では、それらを自由な関数にするだけです。それらをクラスに置く必要性も理由もありません。あなたがテンプレートを使ってしゃべれない限り。

1

他の多くの人が指摘しているように、ネームスペース内の自由な機能は、c++のこの種のものでよく使われるアプローチです。あなたは、テンプレートパラメータから得られた情報に関数のセットを公開したいときに私はすべての静的関数を持つクラスのために作るだろう

一つのケースは、すなわちあなたが達成するためにこれを使用することができ

template <typename Ty> 
    class utils 
{ 
public : 
// if you need to setup a bunch of secondary types, based on "Ty" that will be used 
// by your utility functions 
    struct item_type 
    { 
     Ty data; 
     // etc 
    }; 

// a set of utilities 
    static void foo(Ty &data1, item_type &item) 
    { 
     // etc 
    } 
}; 

テンプレートの名前空間の効果:

int main() 
{ 
    double data; 
    utils<double>::item_type item ; 
    utils<double>::foo(data, item); 

    return 0; 
} 

テンプレートを使用していない場合は、名前空間を使用してください。

これが役に立ちます。

+0

良い点。これは 'std :: numeric_limits <>'のように実装されています。 – Walter

関連する問題