ファクトリメソッドを持つクラスがあるとします
class A {
public:
static A* newA()
{
// Some code, logging, ...
return new A();
}
}
new
ファクトリ メソッドがオブジェクトのインスタンスを作成する唯一のメソッドになるように、 このクラスのオブジェクトのインスタンス化を で防ぐことは可能ですか?
ファクトリメソッドを持つクラスがあるとします
class A {
public:
static A* newA()
{
// Some code, logging, ...
return new A();
}
}
new
ファクトリ メソッドがオブジェクトのインスタンスを作成する唯一のメソッドになるように、 このクラスのオブジェクトのインスタンス化を で防ぐことは可能ですか?
もちろん; コンストラクターをプライベートにするだけです(これが基本クラスの場合は保護されます):
class A {
public:
static A* newA()
{
// Some code, logging, ...
return new A();
}
private:
A() {} // Default constructor
};
必要に応じて、コピー コンストラクターも非公開/保護する必要があります。
そしていつものように、メモリ管理の問題を簡素化するために、生のポインターではなくスマート ポインターを返すことを強く検討する必要があります。
コピー コンストラクターもプライベートにするか、新しい C++11 構文を使用して、コンパイラーにコピーしないように明示的に指示し、次のようにして既定のコンストラクターをプライベートにすることもできます。
struct NonCopyable {
NonCopyable & operator=(const NonCopyable&) = delete;
NonCopyable(const NonCopyable&) = delete;
NonCopyable() = default;
};
class A : NonCopyable {
public:
static std::shared_ptr<A> newA()
{
// Some code, logging, ...
return std::make_shared<A>();
}
private:
A() {} // Default constructor
};
C++03 の方法は通常、次のようなものでした。
class A {
public:
static A* newA()
{
// Some code, logging, ...
return new A();
}
private:
A() {} // no outsider default constructor
A(const A& rhs); // no copy
A& operator=(const A& rhs); // no assignment
};
int main()
{
A x; // C2248
A y(x); // C2248
x = y; // C2248
A* p = A::newA(); // OK
std::cin.get();
return 0;
}