zoukankan      html  css  js  c++  java
  • 【转】C++怎么设计只能在堆或者栈分配空间的类以及定义一个不能被继承的类

    原文地址:http://www.wypblog.com/archives/211

    http://blog.csdn.net/wuzhekai1985/article/details/6635733

    一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?肯定是可以的。

    只能在堆上分配空间:我们可将类的析构函数用private来修饰,也就是把析构函数私有化,因为自动变量与静态变量的对象都在释放空间的时候都需要访问析构函数。若析构函数私有,外面就不能调用,这时候会产生编译错误,这样就达到了只能在堆上分配空间了。但是,把析构函数私有化,那么我们就不能调用delete了, 因为它也需要访问析构函数。这就要求我们自己去提供回收内存空间的函数,以防内存泄漏。

    #include<iostream>
    using namespace std;
    
    class HeapOnly
    {
    public:
        HeapOnly()
        {
            cout << "This is a constructor function." << endl;
        }
        void destroyClass() const
        {
            delete this;
        }
    private:
        ~HeapOnly() {} //外面不能调用了
    };
    
    int main()
    {
        HeapOnly *heapOnly = new HeapOnly;
        heapOnly ->destroyClass();
        return 0;
    }

    只能在栈上分配空间:可将 T:: operator new 全部私有,因为要在堆上分配空间,需要用到new来实现,当你把new私有化,我们就不能调用new T()这样的语句,这样可以达到只能在栈上来分配空间了。

    #include<iostream>
    
    using namespace std;
    
    class StackOnly
    {
    public:
        StackOnly()
        {
            cout << "This is a constructor function." << endl;
        }
        ~StackOnly()
        {
            cout << "destructor Class." << endl;
        }
    
    private:
        void *operator new(size_t);//注意这里
    };
    
    int main()
    {
        StackOnly stackOnly; //这个可以
        StackOnly *p_stackOnly = new StackOnly;//这个不可以,因为new私有了
        return 0;
    }

     定义一个不能被继承的类:容易想到的就是将这个类的构造函数和析构函数都设为私有的。这样继承的类就无法调用父类的构造函数和析构函数,编译时就会报错。但是不能被继承的类如何产生对象呢?可以利用静态函数,它与类的对象无关,可以直接通过类的作用域直接调用。

    class FinalClass
    {
    public:
        static FinalClass* GetInstance()
        {
            return new FinalClass;
        }
     
        static void DeleteInstance(FinalClass* pInstance)
        {
            delete pInstance;
            pInstance = NULL;
        }
    private:
        FinalClass() {}  //私有的构造函数
        ~FinalClass() {} //私有的析构函数
    };
  • 相关阅读:
    重新整理数据结构与算法(c#)—— 树的节点删除[十八]
    重新整理数据结构与算法(c#系列)—— 树的前中后序遍历查找[十七]
    重新整理数据结构与算法(c#系列)—— 树的前中后序遍历[十六]
    js es6 标签模板还原字符串
    MVC过滤器简单刨析
    MVC 测试action的运行速度
    MVC如何创建区域
    软件——IDEA 超实用使用技巧分享
    前端——Vue-cli 通过UI页面创建项目
    软件——IDEA中如何去掉警告虚线
  • 原文地址:https://www.cnblogs.com/xmuliushuo/p/3337395.html
Copyright © 2011-2022 走看看