2016-07-13 5 views
1

私は1つのパブリック静的メソッドといくつかのプライベートメソッドをC++で持つクラスを書いています。この場合、コピーと代入演算子を明示的に削除する(下記のコードを参照)ことは意味がありますか?C++の純粋に静的なパブリックインターフェイスでコピー/代入演算子を削除する意味がありますか?

public: 
    static MyReturnType* CreateSomeMock(const myType input); 

    MyClass(const MyClass&) = delete; 
    MyClass& operator=(const MyClass&) = delete; 

private: 
    static ... 

私はコピーまたは無インスタンス変数とクラス構築デフォルトに割り当てるしようとしている誰かを心配べきではないと言うに傾いています。私はちょうど100%ではなく、コミュニティーがベストプラクティスと考えるものが不思議です。

UPDATE 1

私は、.cppファイルで定義された非メンバ関数であることをプライベートメソッドを移動しました。ヘッダーには依然としてパブリックメンバー関数CreateSomeMockが含まれていますが、私はまだ割り当て/ copy-construction =について不思議です。

UPDATE 2

この "クラス" は、本質的に名前空間です。私はこの点についてのすべての答えに感謝し、この場合の質問の= deleteの部分についてこれを保持したいと思います(この時点では私は本当に避けなければならないと同意します...しかし、時々起こる)。

+5

私はそれがクラスであることが理にかなっているかどうかを尋ねるでしょう。 – juanchopanza

+0

引数はありませんが、それは実際にはもっと機能です。具体的には、ファクトリクラスです。 – PerryC

+2

私はこれがクラスである理由を見ることができませんが、あなたが本当に1つを望むなら、コンストラクタを無効にすることができます。作成できない場合は、コピーすることはできません。 – Dutow

答えて

1

1つ(またはそれ以上)の静的関数、および名前空間内のいくつかの機能を持つクラスの唯一の違いがある:あなたの代わりに名前空間の一部として、非メンバ関数を宣言する必要があるように思えます:クラスをテンプレートパラメータとして使用できますが、名前空間は使用できません。

代わりに、テンプレートパラメータなどの静的メソッドを使用することができますが、あなたはクラスや名前空間に多くのメソッドを追加するときには拡張できません。

など。あなたが持っている場合:

class X { 
public: 
    static void a(); 
    static void b(); 
}; 

をあなたはsome_template<X>としてテンプレートにそれを使用することができ、そして、あなたのテンプレートは、テンプレートパラメータにaとbを呼び出すことができます。

template<typename T> 
void some_template() { T::a(); T::b(); } 

しかしXが名前空間であれば、あなたが希望2つのテンプレートパラメータが必要です :some_template<X::a, X::b>

これは有効な使用例であるため、本当に静的なクラスが必要な場合は、誤ってそのインスタンスを作成しないようにしてください。誰かが誤って、このクラスのインスタンスを作成するときに、それも最低限の場合、コストを持っています:

そのための実用的な理由は、C++で、すべてのオブジェクトがゼロより大きいサイズを必要とすることです。

+0

名前空間内の '' protected'' static'メンバ関数の良い類推はありません。 –

1

それはdeleteにそれらを傷つけるカント、デフォルトの1が文句を言わないコンパイラによって自動的に作成され、この方法。しかし、follow the rule of 3と明示的にデストラクタを宣言する必要があります(重要ではありません)。

このクラスはしかし、その後かなり無意味です。テンプレートを使用するときに

namespace myFactoryPattern { 
    MyReturnType* CreateSomeMock(const myType input); 
1

このパターンは、静的クラスと呼ばれています。テンプレートは、その上に特殊化することができるという点で、名前空間(別の方法として考えるかもしれない)とは異なります。それは期待していますが、削除する必要はないです。(どちらかクラス、または基本クラスで)

  • デフォルト、コピー、移動のコンストラクタ
  • コピーして割り当て

または、代わりにあなたを動かします削除されることがあります

  • デストラクタ(非ポインタとdeleteを許可しない)
  • operator new(size_t)operator new[](size_t)(削除されたことがないです裸のポインタにnewを許可しない)

後者は、何が起こっているか理解し、なぜ彼らが作成し、インスタンスすることはできません、誰もが驚くべきことであり、自分の時間から時間を盗むの楽しさの要因があります。

または、インスタンスを許可するだけでもかまいません。それは本当に誰も傷つけません、経験豊かなプログラマーは何も作成しません。静的メソッドが必要なインターフェイスを満たしている場合、メンバーが渡されることを期待するテンプレート関数に渡すこともできます。

関連する問題