设计一个只能在堆上或栈上实例化的类

一道C++笔试题:设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类

只能在堆内存上实例化的类:将析构函数定义为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;
}

 

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621827.html

时间: 2024-11-05 12:47:42

设计一个只能在堆上或栈上实例化的类的相关文章

一方面:int是值类型,int a 定义在栈上;另一方面int又继承自Object类,是个类,类的对象应该在堆上

问题描述 ①inta=newint();这种写法,a中存储的是地址吗?②有人说,int是个静态类,所以可以inta:这个说法对吗?③版主说,int是值类型,在编译的时候会自动进行装箱拆箱,请问inta=10在编译时会被装箱成对象吗(如果这样岂不是更复杂了)?④一方面:int是值类型,inta定义在栈上:另一方面int又继承自Object类,是个类,类的对象应该在堆上.这不是矛盾嘛? 解决方案 解决方案二:引用楼主sshziliao3的回复: ①inta=newint();这种写法,a中存储的是地

指针-c++对象内存分配的问题,如何确定在堆上还是在栈上?

问题描述 c++对象内存分配的问题,如何确定在堆上还是在栈上? c++中对象内存放堆上还是在栈上是不是根据对象实例化的方法,如: A a; //在栈中分配内存 A * a = new A(); //动态内存分配,在堆上 要是这样,如果我尽量不用指针的话(这样程序风格似乎更加清晰一些),那是不是对象都分配到栈上了?这有什么弊端吗?栈的空间是不是很有限?是不是为了栈空间的问题我们必须尽量多用new分配内存呢?类成员是不是也要多用指针呢? 解决方案 经过昨晚大家的热心帮助,对该问题的疑问已经烟消云散,

c#-C#中Cs cs1;的cs1只是一个引用符,cs1占空间吗??不过很多书上说是存储是栈上

问题描述 C#中Cs cs1;的cs1只是一个引用符,cs1占空间吗??不过很多书上说是存储是栈上 可是这个Cs cs1;只是一个类的引用符的声明,声明不是不占空间的吗,何来在"栈"上存储了 Cs 是一个类名. 解决方案 Cs cs1 = null; 它的意思是分配了栈空间,但此对象没有对应的堆首地址的指向.即 解决方案二: 对象的声明是栈上分配一个指针,在堆上分配具体的空间.没有实例,只占用了栈上的空指针地址空间,没有堆上具体内存的开销. 解决方案三: class Cs { stat

设计一个有getMin功能的栈

package stackAndQueue; import java.util.Stack; import org.junit.Test; /** * * 设计一个有getMin功能的栈:StackGetMin[1]. * * [实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作] * * 要求:1.pop.push.getMin操作的时间复杂度都是O(1);2.设计的栈类型可以使用现成的栈结构. * * 设计思路:两个栈-普通栈+getMin栈 * * @author

一个好的界面设计应该注意的75个原则(上)

  1. 使用单栏布局代替多栏布局 单栏布局能够让用户对全局有更好的掌控,对内容一目了然.而多栏布局可能会分散用户注意力.最好的做法是用一个有逻辑的叙述来引导用户并在末尾放上你的行动按钮. 2. 使用礼品诱惑代替生硬的推销 例如可以给用户提供礼物来表达你的友善姿态.更深层的讲,送礼是一种基于互惠原则的有效说服策略.显而易见的好处是让你在往后的活动进展中更加顺利. 3. 合并重复的功能避免分散 随着时间的推移,不可避免的你增加了很多模块.元素,而且功能相同.碎片化的界面会增加用户的学习曲线,所以需

请教:数组是引用类型,所以数组存在堆上,那数组中的元素存在栈上吗?

问题描述 请教:数组是引用类型,所以数组存在堆上,那数组中的元素存在栈上吗? 解决方案 解决方案二:数组中的元素可以通过地址找到,应该是在堆上解决方案三:当然在堆上,类是引用类型,类实例的某个字段是值类型,类实例的某个字段还是在堆上,数组的情况也一样解决方案四:建议看看装箱,拆箱解决方案五:数组里的对象没有装箱,拆箱问题.就是在堆上分配内存.c,c++的数组可以分配在栈上效率比c#好

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

队列和栈面试题(一)— 请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据

题目:请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中. 思路:首先申请一个栈sta来存放数据栈,再申请一个辅助栈help来存放临时数据,然后比较sta弹出的栈顶的值res与help栈顶元素的大小. 当sta栈不为空时: 1.如果help.empty()或者res<=help.top(),那么就把res的值压入help栈中: 2.如果help不为空并且res>help.top(),那么就把help中栈顶的值弹出并压入sta栈,最后把

用C++设计一个不能被继承的类

在Java 中定义了关键字final,被final修饰的类不能被继承. 首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数.那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数.析构函数而导致编译错误. 可是这个类的构造函数和析构函数都是私有函数了,怎样才能得到该类的实例呢?可以通过定义静态来创建和释放类的实例.基于这个思路,可以写出如下的代码: ///////