zoukankan      html  css  js  c++  java
  • 数组类的进一步完善

    原始代码一:

    IntArray.h

    #ifndef _INTARRAY_H_
    #define _INTARRAY_H_
    
    class IntArray
    {
    private:
        int m_length;
        int* m_pointer;
    
        IntArray(int len);
        IntArray(const IntArray& obj);
        bool construct();
    public:
        static IntArray* NewInstance(int length);
        int length();
        bool get(int index, int& value);
        bool set(int index ,int value);
        ~IntArray();
    };
    
    #endif

    IntArray.cpp

    #include "IntArray.h"
    
    IntArray::IntArray(int len)
    {
        m_length = len;
    }
    
    bool IntArray::construct()
    {
        bool ret = true;
    
        m_pointer = new int[m_length];
    
        if( m_pointer )
        {
            for(int i=0; i<m_length; i++)
            {
                m_pointer[i] = 0;
            }
        }
        else
        {
            ret = false;
        }
    
        return ret;
    }
    
    IntArray* IntArray::NewInstance(int length)
    {
        IntArray* ret = new IntArray(length);
    
        if( !(ret && ret->construct()) )
        {
            delete ret;
            ret = 0;
        }
    
        return ret;
    }
    
    int IntArray::length()
    {
        return m_length;
    }
    
    bool IntArray::get(int index, int& value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            value = m_pointer[index];
        }
    
        return ret;
    }
    
    bool IntArray::set(int index, int value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            m_pointer[index] = value;
        }
    
        return ret;
    }
    
    IntArray::~IntArray()
    {
        delete[]m_pointer;
    }

    main.cpp

    #include <iostream>
    #include <string>
    #include "IntArray.h"
    
    using namespace std;
    
    int main()
    {
        IntArray* a = IntArray::NewInstance(5);
    
            cout << "a.length() = " << a->length() << endl;
    
            a->set(0,2);
    
            for(int i=0; i<a->length(); i++)
            {
                int v;
                a->get(i,v);
                cout << "i =" << i << "  " << "v =" << v <<endl;
    
            }
    
        delete a;
    
        return 0;
    }

    原生代码二:使用上篇博客中重载的数组操作符

    IntArray.h

    #ifndef _INTARRAY_H_
    #define _INTARRAY_H_
    
    class IntArray
    {
    private:
        int m_length;
        int* m_pointer;
    
        IntArray(int len);
        IntArray(const IntArray& obj);
        bool construct();
    public:
        static IntArray* NewInstance(int length);
        int length();
        bool get(int index, int& value);
        bool set(int index ,int value);
        int& operator [](int index);
        ~IntArray();
    };
    
    #endif

    IntArray.cpp

    #include "IntArray.h"
    
    IntArray::IntArray(int len)
    {
        m_length = len;
    }
    
    bool IntArray::construct()
    {
        bool ret = true;
    
        m_pointer = new int[m_length];
    
        if( m_pointer )
        {
            for(int i=0; i<m_length; i++)
            {
                m_pointer[i] = 0;
            }
        }
        else
        {
            ret = false;
        }
    
        return ret;
    }
    
    IntArray* IntArray::NewInstance(int length)
    {
        IntArray* ret = new IntArray(length);
    
        if( !(ret && ret->construct()) )
        {
            delete ret;
            ret = 0;
        }
    
        return ret;
    }
    
    int IntArray::length()
    {
        return m_length;
    }
    
    bool IntArray::get(int index, int& value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            value = m_pointer[index];
        }
    
        return ret;
    }
    
    bool IntArray::set(int index, int value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            m_pointer[index] = value;
        }
    
        return ret;
    }
    int& IntArray::operator [](int index)
    {
        return m_pointer[index];
    }
    IntArray::~IntArray()
    {
        delete[]m_pointer;
    }

    main.cpp

    #include <iostream>
    #include <string>
    #include "IntArray.h"
    
    using namespace std;
    
    int main()
    {
        IntArray* a = IntArray::NewInstance(5);
    
            cout << "a.length() = " << a->length() << endl;
    
            //a->set(0,2);
            (*a)[0] = 2; //*a就是数组类的对象
            for(int i=0; i<a->length(); i++)
            {
                cout << (*a)[i] <<endl;
            }
    
        delete a;
    
        return 0;
    }

    以上就利用了我们上篇博客中介绍的重载数组类的操作符。但是在main.cpp中你会看到*a的存在。在C++中,能不使用指针,就不要用指针(工程开发的原则)。

    代码三:不使用*a这个指针

    使用一个成员函数,让其返回自身。

    IntArray.h

    #ifndef _INTARRAY_H_
    #define _INTARRAY_H_
    
    class IntArray
    {
    private:
        int m_length;
        int* m_pointer;
    
        IntArray(int len);
        IntArray(const IntArray& obj);
        bool construct();
    public:
        static IntArray* NewInstance(int length);
        int length();
        bool get(int index, int& value);
        bool set(int index ,int value);
        int& operator [](int index);
        IntArray& self();
        ~IntArray();
    };
    
    #endif

    IntArray.cpp

    #include "IntArray.h"
    
    IntArray::IntArray(int len)
    {
        m_length = len;
    }
    
    bool IntArray::construct()
    {
        bool ret = true;
    
        m_pointer = new int[m_length];
    
        if( m_pointer )
        {
            for(int i=0; i<m_length; i++)
            {
                m_pointer[i] = 0;
            }
        }
        else
        {
            ret = false;
        }
    
        return ret;
    }
    
    IntArray* IntArray::NewInstance(int length)
    {
        IntArray* ret = new IntArray(length);
    
        if( !(ret && ret->construct()) )
        {
            delete ret;
            ret = 0;
        }
    
        return ret;
    }
    
    int IntArray::length()
    {
        return m_length;
    }
    
    bool IntArray::get(int index, int& value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            value = m_pointer[index];
        }
    
        return ret;
    }
    
    bool IntArray::set(int index, int value)
    {
        bool ret = (0 <= index) && (index < length());
    
        if( ret )
        {
            m_pointer[index] = value;
        }
    
        return ret;
    }
    int& IntArray::operator [](int index)
    {
        return m_pointer[index];
    }
    IntArray& IntArray::self()
    {
        return *this; //返回this指针指代的当前对象即可。
    }
    IntArray::~IntArray()
    {
        delete[]m_pointer;
    }

    main.cpp

    #include <iostream>
    #include <string>
    #include "IntArray.h"
    
    using namespace std;
    
    int main()
    {
        IntArray* a = IntArray::NewInstance(5);
    
    //当前的这个数组对象是在数组空间中创建的,所以说它没有名字,因此需要给它起一个别名。如何给一个已经存在的对象起别名呢?
    //还是通过引用
        if(NULL != a)
        {
            IntArray& array = a->self();//此时的array就是a指针指向堆空间里对象的别名了
               cout << "array.length() = " << array.length() << endl;
            array[0] = 2; //*a就是数组类的对象
                    for(int i=0; i<array.length(); i++)
            {
                cout << array[i] <<endl;
            }
        }
    
        delete a;
    
        return 0;
    
    }

    这个代码还不是很完美,因为我们还看到了指针。

    IntArray* a = IntArray::NewInstance(5);在这里有没有什么东西可以替代指针呢?使用智能指针来解决。智能指针本质上也是一个类的对象。
    
    
  • 相关阅读:
    适配器设计模式初探(Java实现)
    装饰器设计模式初探及Java中实际应用举例
    主要介绍JavaEE中Maven Web 项目的结构及其它几个小问题
    基于alibaba开源的分布式数据同步系统安装配置文档otter之manager单实例配置
    基于alibaba开源的分布式数据同步系统安装配置文档otter之环境配置
    zabbix监控redis DB key的总数量
    C#操作Access数据库(创建&修改结构)
    WebDev.WebServer.exe遇到问题需要关闭
    DataSet
    ADO.NET
  • 原文地址:https://www.cnblogs.com/-glb/p/11924124.html
Copyright © 2011-2022 走看看