2

私は常にプライベートコンストラクターがオブジェクトの作成を妨げることを読んできました。私はそれらをシングルトンパターンで使用しており、プライベートコンストラクターを使用して(静的メソッドなどを使用して)オブジェクトを作成する方法を知っています。オブジェクトの初期化にコンストラクターが使用されることは知っています。

しかし、プライベートコンストラクターがオブジェクトの作成を妨げている理由が正確にはわかりません。オブジェクトが初期化されない場合はどうなりますか。ガベージをスローする必要があることを意味しますが、なぜ制限するのですか??

stackoverflow で既存の回答をすべて確認しましたが、正確な概念がわかりません。

4

5 に答える 5

5

クラスのプライベートスコープはクラスのインスタンス化を妨げませんが、実際には「誰が」オブジェクトを作成できるかを制限します.

これは、外部からアクセスすることはできず、および他の `friend 関数とクラスに対してのみアクセスできる、プライベート スコープの他のメンバー データのようなものaccessorsですgetters

#include <iostream>
using namespace std;

class Foo
{
    public:
        Foo(int x) : value(x){ cout << "Foo(int) public ctor" << endl;} // ctor

        void SetValue(int x) {value = x;}  // setter
        int  GetValue()const{return value;}// getter

    private:
        int value;
        Foo(){ cout << "Foo() private ctor" << endl;} // private ctor

        friend ostream& operator<<(ostream& out, Foo& rhs)
        {
            out << rhs.value;
            return out;
        }
        friend Foo* CreateObject();
};

Foo* CreateObject()
{
    Foo* ptrFoo = new Foo;
    return ptrFoo;
}


int main ()
{

    //Foo theFoo;     // error C2248: 'Foo::Foo' : cannot access private member declared in class 'Foo'
    Foo theFoo2(0); // ok
//  cout << theFoo2.value << endl; // error C2248: 'value' : cannot access private member declared in class 'Foo'
    cout << theFoo2.GetValue() << endl; // ok
    cout << theFoo2 << endl;

    Foo* ptrFoo = CreateObject();
    ptrFoo->SetValue(7);
    cout << ptrFoo->GetValue() << endl;


    cout << endl;
    return 0;
}
于 2016-12-28T11:58:33.990 に答える