本文共 1314 字,大约阅读时间需要 4 分钟。
如何设计一个类, 使之对象实例只能在堆中创建(new生成) 如何设计一个类, 使之对象实例只能在栈中创建(变量定义)
class OnlyStack { public: OnlyStack(){} private: void* operator new( size_t ); } int main( int argc, char* argv[] ) { OnlyStack stack; // OK OnlyStack *heap = new OnlyStack; // Error } --------------------------------------------------------------- //禁止在heap中
class number { private: static void*operator new(size_t size); static void operator delete(void*ptr); .......... }; //禁止在栈上 class number { private: ~number(); public: void destory()const{delete this;} ............ } --------------------------------------------------------------- 限制对象只能创建在堆上是一种比较常见的需求,也有成熟的设计模式。 但是,如何限制对象只能创建在栈上就比较新鲜,好象没有现成的模式可用,想不出用什么方法来做。楼上几位的方法都是有问题的。我倒是有一个方法,但必须用汇编来实现(而且不能用嵌入汇编,只能用汇编直接写一个函数,连接到主程序中,这样的话,必须手工 mangle/demangle new运算符的函数名),这个与平台、编译器紧密相关,算不上是C++的解法。不知诸位大侠有没有更佳的方案? 下面是汇编代码,不过,没试过,呵呵,也不知道各个编译器的具体情况,要做好多假设啊,所以没时间来试。 .386 .model flat .code public OverideNewMangledName ; 这里需要知道编译器的重载成员new操作符mangle后的名字 ; 这段代码是平台/编译器相关的, ; 它有许多假定,如假定 new 操作符使用 cdecl 调用约定等等 OverideNewMangledName proc POP EBX ; 返回地址 POP EAX ; sizeof(MyObject), 这里假定 new 只有一个形参 SUB ESP,EAX ; 在栈中开辟对象存储空间 MOV EAX,ESP ; 这里是要返回的对象指针 SUB ESP,4 ; 为形参占个位置而已, 保持栈顶为调用前状态 PUSH EBX RET OverideNewMangledName endp ; 这里假定返回后编译器会调用对象的构造函数, 这个假定一般倒是成立 END 函数返回后,对象指针被返回,且对象位置在栈顶上。如果把类的构造函数设为私有,就达到了只能在栈上创建的目的了。转载地址:http://awzli.baihongyu.com/