假设我有一个带有工厂方法的类
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;
}