设计一个只能在堆上或栈上实例化的类
2014-07-20 18:46
134 查看
一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类
只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。
只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。
下面一个类也只能在堆内存上生成,将构造函数和析构函数都定义为private,但是可以通过类的static函数创建对象,不过这个对象是不能被继承的。
#include <iostream>
using namespace std;
//只能在堆内存上实例化的类
class FinalClass
{
public :
static FinalClass* GetInstance()
{
cout<<"Constructor of the class"<<endl;
return new FinalClass;
}
static void DeleteInstance(FinalClass* pInstance)
{
cout<<"Destructor of the class"<<endl;
delete pInstance;
pInstance = 0;
}
private :
FinalClass() {}
~FinalClass() {}
};
int main()
{
//use of CHeapOnly
FinalClass* fc = FinalClass::GetInstance();
FinalClass::DeleteInstance(fc);
return 0;
}
只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用。也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造。
只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete。
#include <iostream> using namespace std; //只能在堆内存上实例化的类 class CHeapOnly { public: CHeapOnly() { cout << "Constructor of CHeapOnly!" << endl; } void Destroy() const { delete this; } private: ~CHeapOnly() { cout << "Destructor of CHeapOnly!" << endl; } }; //只能在栈内存上实例化的类,就是不能使用new来构造类,把operator new私有化 class CStackOnly { public: CStackOnly() { cout << "Constructor of CStackOnly!" << endl; } ~CStackOnly() { cout << "Destrucotr of CStackOnly!" << endl; } private: void* operator new(size_t size) { } void operator delete(void * ptr) { } }; int main() { //use of CHeapOnly CHeapOnly* pHeap = new CHeapOnly; pHeap->Destroy(); //error use of CHeapOnly //CHeapOnly objHeap; //use of CStackOnly CStackOnly objStack; //error use of CStackOnly //CStackOnly* pStack = new CStackOnly; return 0; }
下面一个类也只能在堆内存上生成,将构造函数和析构函数都定义为private,但是可以通过类的static函数创建对象,不过这个对象是不能被继承的。
#include <iostream>
using namespace std;
//只能在堆内存上实例化的类
class FinalClass
{
public :
static FinalClass* GetInstance()
{
cout<<"Constructor of the class"<<endl;
return new FinalClass;
}
static void DeleteInstance(FinalClass* pInstance)
{
cout<<"Destructor of the class"<<endl;
delete pInstance;
pInstance = 0;
}
private :
FinalClass() {}
~FinalClass() {}
};
int main()
{
//use of CHeapOnly
FinalClass* fc = FinalClass::GetInstance();
FinalClass::DeleteInstance(fc);
return 0;
}
相关文章推荐
- 设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个类,该类不能被继承,且只能实例化3次
- 设计一个只能在堆上或栈上实例化的类
- 用c++设计一个类,这个类只能被实例化3次,且不能被继承
- 设计一个只能在堆上或栈上实例化的类
- 设计一个类,该类不能被继承,且只能实例化3次
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 设计一个只能在堆上或栈上实例化的类
- 笔试题目:定义一个类不能被继承,且只能被实例化3次 .
- 定义一个类不能被继承,且只能被实例化3次
- 设计一个类,只能实现1个实例或3个实例
- 只能生成一个对象的类(经典设计模式之一)
- C#--第10周实验--任务2--设计一个窗体--文本框只能输入0至9这十种数字,且长度最多8个
- 写一个类,要求:该类不能被继承且只能被实例化三次(转)
- 单态设计模式:(最终只能得到一个对象)
- 第七十二题(设计一个类,我们只能生成该类的一个实例)
- c++ 设计一个不能被继承的类,但可以实例化
- 【转】C++怎么设计只能在堆或者栈分配空间的类以及定义一个不能被继承的类