2017-01-31 15 views
5

The Principle Engineer私の最後の会社では、privatestaticのメソッドは、クラスメソッドではなく、実装ファイルの関数として実装する必要があります。私的静的メソッドの必要性はありますか?

彼のルールに例外があるかどうかはわかりません。私は現在の仕事でその動機に遭遇しました:問題の関数の引数または戻り値の型が、ヘッダに定義ファイルを含める必要があるオブジェクトである場合、これは不必要な問題を引き起こす可能性があります。

離れて二度とprivatestatic方法を使用してから私を操縦するのに十分なのですが、私はそれらをオフに書いた前に、私は、誰もが、彼らが実装ファイル機能がないことを埋めるニッチを認識しているかどうかを知りたいと?

EDIT:

例はここに役立つかもしれません。

class Foo { 
    static void foo(); 

だからfooFooの他の方法によってのみアクセス可能である:これは、実装ファイルでvoid foo()を呼び出す他の方法を持っているclass Fooの宣言の開始であると言います。なぜ私は実装ファイルにfooを定義して、それをヘッダからまとめて保存しないのですか?

+0

@Downvoterダウン投票の理由はありますか?明らかに[tag:C++]に関する必須の投票を提供しているだけの場合、返信する必要はありません。 –

+1

'private static'データ(例えば、作成されたインスタンスの数)にアクセスするには、空き関数ではなくクラスメソッドが必要です。 –

+0

メソッドが 'public'または' protected'の場合、どう違うのでしょうか?あなたの質問に引用されているルールは、なぜ「プライベート」が特別な扱いを受けるのかを説明していません。 –

答えて

2

メンバー関数は、すべてのクラスのメンバーprivateにアクセスできます。関数がこれらのメンバーにアクセスする必要がある場合、関数はメンバーでなければなりません。これは、それがstaticであるかどうかにかかわらず適用されます。

staticは、特定のオブジェクトに対して機能しない関数です。ただし、パラメータとしてオブジェクトを受け取ることはできます。たとえば、

class A 
{ 
    int m; 

    static int process_3_objects_in_some_way(A x, A y, A z) 
    { 
     return x.m + y.m + z.m; 
    } 
} 

もう1つの理由は、パラメータの順序です。たとえば、print

class A 
{ 
    int m; 

    static void print(std::ostream& stream, A x, int options) 
    { 
     stream << "Value is: " << (x.m * 1000000 + options); 
    } 
} 
+0

私はあなたの2番目の例が 'm'ではなく' x.m'と言うべきだと思いますか?しかし、良い例です。 –

+0

はい。固定されています..... – anatolyg

+0

これは最高の例であり、少なくとも私は受け入れられた答えが少なくともコンパイル可能であるようにしたいからです。あなたは 'print'が' ostream& '権利を返すようにしたかったと思いますか? –

11

実装ファイルに自立型関数staticとは異なり、プライベート静的メンバー関数をクラスのヘッダーで使用できます。これは、あなたのプライベート静的関数を呼び出す非プライベートメンバ関数を、インライン化したい状況で重要である:

class Demo { 
private: 
    static std::string sanitize(const std::string& name); 
    std::string name; 
public: 
    Demo(const std::string& n) : name(sanitize(n)) { 
    } 
}; 

自立静的関数と同じことを行うと、CPPにDemoのコンストラクタを実装する必要になりますファイル。

+0

これは素晴らしい例です。だから、おそらく例外は: "ヘッダー内で関数が必要ないとき。" –

+1

@JonathanMeeはい、私はこのルールをC++の日に戻しました。 "静的メンバー関数と静的メンバ変数に自立静的関数と静的変数を使用することをお勧めします。ただし、クラスのヘッダーで使用する必要がある場合を除きます。" – dasblinkenlight

+0

それは私の質問に関する曖昧な明確化のコメントによって明らかに証明されているように、私のfumblingsよりも良いと言われています。 –

1

friend別の実装ファイルで実装されている関数またはクラスは、プライベート静的メンバー関数が必要な別の例です。

+0

'friend'は私が探していたものではありませんが、それはこのルールの例外の公正な例だと思います。 –

関連する問題