-3

C++でコンストラクタをプライベートにすることはできますか? はいの場合、どうすればそれを呼び出すことができますか?

class Puma
{
    int a = 10;
    Puma()
    {
        cout << a;
    }
};

int main()
{
    Puma pum;
    return o;
}

このプログラムは実行できますか? Puma()そうでない場合、コンストラクターはプライベートであるため、どのように呼び出すことができますか?

4

5 に答える 5

20

はい、コンストラクターはプライベートにすることができます。また、メンバー関数 (静的または非) またはフレンド関数で呼び出すことができます。

class Puma
{
public:
    static Puma create(int a) { return Puma(a); }
private:
    int age;
    Puma(int a) :age(a) {}    

    friend Puma createPuma(int a);
};

Puma createPuma(int a) { return Puma(a); }

考えられる使用例については、Factory パターン、またはNamed Constructor Idiomを参照してください。

于 2013-08-08T17:46:39.027 に答える
8

はい。コンストラクターはプライベートにすることができます。

この場合、クラスを作成できます

  • 別の (パブリック) コンストラクターの使用
  • 同じクラスからコンストラクターを呼び出す
  • フレンド クラス/関数からコンストラクタを呼び出す
于 2013-08-08T17:47:34.527 に答える
3

コードでは、コンストラクターを定義しており、それがプライベートであるため、プログラムを実行できません。したがって、現在のコードでは、クラスのオブジェクトを作成する方法がなく、ある意味でクラスが役に立たなくなります。

1 つの方法は、パブリックな静的関数を提供することです。これらの静的関数は、クラスのオブジェクトを作成するためにプライベート コンストラクターを呼び出します。

ちょっとしたこと:

return o;

する必要があります

return 0;
于 2013-08-08T17:47:20.217 に答える
2

はい、コンストラクターはプライベートにすることができます。たとえば、静的メンバー関数 (またはフレンド) によって呼び出されると便利です。

 class Even {
  /// in practice, some more C++ code is probably needed
  private: 
    int x;
    Even(int a) : x(a) {};
  public:
     int get () const { return 2*x; }; 
     static Even* make(int y) { return new Even(y); };
  };

この例はあまり現実的ではありませんが、アイデアはわかります。使用コードで、

   Even* e = Even::make(3);

ただし、C++の 5 の規則に注意し、優れたC++ プログラミングの本と、C++ コンパイラ ( GCCClangなど) およびデバッガ ( GDBなど)のドキュメントを読んでください。Clang 静的アナライザーを使用することもできます。

たとえば、QtFLTKRefPerSysfishGCCまたはClangのソース コードをダウンロードして内部を調べます。

于 2013-08-08T17:48:54.073 に答える
1

シングルトンは、クラスの静的メソッドから呼び出されるプライベート コンストラクターを持つことができます。

于 2013-08-08T17:47:21.343 に答える