9

クラス ClassA のメンバー変数とメンバー関数はすべて静的です。

ユーザーが (誤って) このクラスのオブジェクトを作成しようとすると、次のような警告が表示されます。したがって、ユーザーがこのクラスのオブジェクトを作成しようとするのを防ぎたいと思います。

プライベートなデフォルト (変数なし) コンストラクターを作成するだけで十分でしょうか? または、プライベート コピー コンストラクターとプライベート代入演算子も作成する必要がありますか (既定のコンストラクターを使用しないようにするため)。また、それらも作成する必要がある場合は、代わりにダミーの純粋仮想関数を作成する方がよいのではないでしょうか。これにより、ユーザーはオブジェクトを作成できなくなりますか?

ありがとうございました

4

5 に答える 5

20

すべての静的メソッドを持つクラスを使用する代わりに、別の名前空間でメソッドを独立した関数にする方がよい場合があります。呼び出し構文は同じです。

namespace::function()それ以外のclassname::function()

クラスをインスタンス化しようとしている誰かに対処する必要はありません。

于 2008-12-09T17:28:04.923 に答える
11

プライベートなデフォルト コンストラクターを作成するだけで十分です。他のデフォルト構成 (コピー コンストラクターと代入) はどちらも、インスタンスが正しく機能することに依存しています。デフォルトのコンストラクターがない場合、インスタンスを作成する方法がないため、実際にコピー構築部分に到達する方法がありません。

3つすべてを非公開で実装されていないと定義することで、いくつかの頭痛の種を節約できるでしょう。

于 2008-12-09T17:19:54.097 に答える
10

他の人が言ったように、名前空間を使用する必要があります。クラスにとどまりたい場合は、プライベートコンストラクターを持つクラスを作成し、そこから派生させて、意図を明確にします。

class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

では、これを行う唯一の方法である名前空間を見てみましょう。

namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

どちらの場合でもそれを使用して呼び出すことができますSuperUtils::foo();が、名前空間には、スコープ内で名前空間の宣言とディレクティブを使用して、特定またはすべてのメンバーを現在のスコープに入れることができるという利点があるため、使用せずにそれらを参照できますSuperUtils::

void superFunction() {
    using namespace SuperUtils;
    foo();
}

通常、これは避けるべきですが、メソッドが SuperUtils から多くのものを排他的に使用している場合に役立ちます。これにより、コードの可読性が向上します。

于 2008-12-09T17:54:26.477 に答える
3

コピー コンストラクターを使用するには、コピーするオブジェクトが必要なので、既定のコンストラクターをロックダウンしている場合は安全です。

于 2008-12-09T17:20:00.790 に答える
0

ヒープ以外のオブジェクトの作成を防ぐ最善の方法は、デストラクタを非公開にすることです。次に、オブジェクトがスコープ外になったときにコンパイラがオブジェクトを破棄する方法がなく、文句を言います。ただし、これは誰もが新しいことをするのを妨げるものではありません。

于 2008-12-10T08:35:36.823 に答える