今天在这里面看到了这个题目,据说还是Google面试题。
http://www.cnblogs.com/chio/archive/2007/10/23/934335.html
总的思想,是把一些在栈上或者堆上面创建对象,所必须的函数设为private使得编译报错。
比如:
只能在堆上创建,不能在栈上创建。因为栈上的对象,总是要调用析构函数。所以把析构函数设为private,然后new出来的对象,显式的调用delete就可以了。
class HeapOnly{public: void destroy() const { delete this; }private: ~HeapOnly(){};};int main(){ //HeapOnly obj; HeapOnly *pobj = new HeapOnly; //do things pobj->destroy(); //delete pobj; return 0;}
也提到Singleton里面的那样方式,把构造函数放进private。但是那样不管直接new,还是在栈上面创建对象,都不能成功。
不能在堆上创建,只能在栈上面创建的对象。
就是把new和delete操作符重载为private。
class OnlyStack
{ public: OnlyStack(){} private: void* operator new(size_t ); void operator delete(void*ptr); // } int main( int argc, char* argv[] ) { OnlyStack obj; // OK //OnlyStack *pobj = new OnlyStack;// Error }