考虑到 A 类,我想将它的创建限制为新的。那是
A* a = new A; // Would be allowed.
A a; // Would not be allowed.
这怎么可能实现?
您可以将构造函数设为私有并提供一个static
返回动态分配实例的工厂方法:
class A
{
public:
static A* new_instance() { return new A(); }
private:
A() {}
};
与其返回原始指针,不如考虑返回智能指针:
class A
{
public:
static std::shared_ptr<A> new_instance()
{
return std::make_shared<A>();
}
private:
A() {}
};
一种选择是将构造函数设为私有,并使用静态辅助函数:
class A {
private:
A() {} // Default constructor
A(const A &a); // Copy constructor
public:
static A *create() { return new A; }
};
...
A a; // Won't compile
A *p = A::create(); // Fine
尽管您应该强烈考虑返回智能指针而不是原始指针。
是的,您可以使用工厂模式来做到这一点。
class A
{
A() {} //private by default
friend struct AFactory;
};
struct AFactory
{
static A* newA() { return new A; }
};
或类似的static
成员函数。
这实际上非常简单。将您的析构函数设为私有。不能在堆栈上创建具有私有析构函数的对象,因此创建它们的唯一方法是通过调用“new”。您需要提供另一种删除对象的机制,例如调用“delete self”的“delete()”方法。
我假设您正在尝试控制客户可以对您的班级做什么。这里的答案使用了稍微神秘的技术。隔离系统的一种常用方法是使用接口。
你可以做一个摘要:
class A
{
public:
virtual void doSomething() = 0;
virtual ~A() {}
};
并至少进行一种实现:
class A_impl : public A
{
public:
virtual void doSomething()
{
// behaviour
}
};
A_impl
然后按照其他答案的建议,使用(智能)指针向客户端返回一个实例。
你不能只做:
A* a;
? 那只是声明一个指向A
对象的指针。它还没有被初始化,所以你可能应该这样做
A* a = NULL;
那是指向类型对象的指针,A
但指向已知(非)值。
编辑:鉴于此处其他答案的复杂性,也许我没有掌握完整的问题。
EDIT2:他是否在问您是否可以阻止在堆栈上创建对象并只允许堆创建对象并通过指针访问?如果是这样的话,我的投票将投向工厂模式。