2017-07-18 8 views
-2

C++ 11では静的メソッドのみを持ち、インスタンス化または継承することができないクラスという "静的クラス"を作成したかったのです。コンパイラはデフォルトでもコピーコンストラクタどちらが作成されます。この方法では、コピーコンストラクタを "削除"することでC++ 11クラスのインスタンス化を防止する

class Foo final { 
    public: 
    static void methodA(...); 
    static int methodB(...); 
    Foo(const Foo&) = delete; 
}; 

: は、次の解決策を考え出しました。 Visual StudioのIntelliSenseは、Foo(と入力したときにのいずれかのコンストラクタが自動完了しないため、これを確認します。

私は、このソリューションがデフォルトのコンストラクタをprivateにする「一般的な」アプローチよりも望ましいかどうか疑問に思っています。賛否両論はありますか?あなたがやりたいだろう(@ jamesdlinさんのコメントどおり)、ジョブの間違ったツール、namespaceを使用しているよう

+12

代わりに名前空間を使用してみませんか? – jamesdlin

+0

ええ、これまでクラスの機能を使用していない場合は、クラスを作成していません。名前空間を作成しています。 – tadman

+0

コンストラクタを非公開にすることは、deleteキーワードなしでできることです。エフェクトは同じで、コードは生成されません。私は新しい構文を使うつもりです。なぜならそれは読みやすいからです。 –

答えて

3

CTORのプライベートを作るの違いは、これがあったことですあなたが= deleteを使用できない古いC++標準に使用されています。これを行う古い形式は、コンパイラではなくエラーメッセージを与えるためにリンカに依存するため、「クリーン」ではありません。あなたのctorがプライベートで定義なしで、とにかく(クラス関数内から)呼び出すと、リンカーはビルドプロセスをエラーで中止する責任があります(ctorは宣言されているだけで定義されていないためです)。 )= deleteフォームは、コンパイラーがエラーを直接発行できるため、よりクリーンです。

ただし、ここの後ろにあるのは名前空間に非常に似ています。だから私はこれを代わりに行うことをお勧めします:

namespace Foo { 
    void methodA(...); 
    int methodB(...); 
} 

これは、関数を呼び出すための完全修飾フォームを変更しません。これまでと同様に、にはFoo::methodA()と記載されているので、これはドロップインの代替として機能するはずです。

Foo::には、希望する場合はusingステートメントを使用することもできます。たとえば、次のように

using Foo::methodA; 
methodA(); // Valid call. 

それともusing Foo;Foo::でそれらのいずれかの前に付けることなく、現在のスコープにFooからすべての識別子を持参します。 (名前空間の汚染については、ここで通常の注意が必要です。)

これは静的クラス関数では実行できません。

1

はルックス:

namespace Foo { 
    void methodA(...); 
    int methodB(...); 
}; 
関連する問題