自定义矢量的清晰功能

时间:2014-04-01 13:43:17

标签: c++ templates vector clear

template <class DataType> /// Declaring the template class Datatype
class Vector
{   public:
    Vector()
    {m_data = new DataType[9999]; 
      m_size = 1;

        m_current = 0;
    }

    Vector(int size)  /// Constructing vector
    { m_data = new DataType[size]; 
      m_size = size;
      m_current = -1;
    }

    ///////////////////////////////////////
    /// Creating Push and Pop methods
    ///////////////////////////////////////

    bool push(const DataType data) 
    { if (m_current < m_size)
      { m_current++;
        m_data[m_current] = data;
        return true;
      }
      else
      { return false; }
    }

    bool pop(DataType &data)
    { if (m_current==-1)
      { cout << "Nothing to pop";
        return false;
      }
      else
      { data = m_data[m_current];
        m_current--;
        return true;
      }
    }

    ///////////////////////////////////////
    /// Methods to access the private m_data
    ///////////////////////////////////////

    float retrievefloat(int pointer) 
    {
        return m_data[pointer];
    }

    string retrievestring(int pointer)
    {
        return m_data[pointer];
    }

    int retrieveint(int pointer)
    {
        return m_data[pointer];
    }

    int retrievecurrent()
    {
        return m_current;
    }

    int retrievesize()
    {
        return m_size;
    }

private:

    DataType* m_data;
    int m_size;
    int m_current;
};

好的,这里我们有一个自定义的模板化矢量类。这里的问题是,我希望包含clear()函数。我知道你可以做int m_size = 0int m_current = -1。但是你如何重置m_data?

当我想在调用delete [] m_data函数后再次推送数据时,尝试clear会使程序崩溃。

1 个答案:

答案 0 :(得分:0)

我应该从哪里开始......现在,这不是 vector 类,而是 stack 类。

您的代码存在很多问题,但为了解决您的初始问题,您不应该在clear()方法中删除m_data。通常,类的用户不会读取推送范围之外的对象,因此不需要删除或重新分配。此外,由于所有且仅有的构造函数设置了向量的大小并分配它,因此您希望它不会更改,并假设您的m_data缓冲区始终是已分配的。清楚之后,就没有地方推送你的数据了!

这可能是你的标准:

void clear()
{
    m_current = -1;
}

看看这个修订过的,但远非完整的片段。玩得开心......

template<typename DataType> /// Declaring the template class Datatype
class Vector
{
public:
    Vector(size_t size = 9999)  /// Constructing vector
    {
        if (size == 0)
        {
            size = 9999;
        }
        m_data = new DataType[size]; 
        m_size = size;
        m_current = -1;
    }

    void clear()
    {
        m_current = -1;
    }

    ///////////////////////////////////////
    /// Creating Push and Pop methods
    ///////////////////////////////////////

    bool push(const DataType data) 
    { if (m_current < m_size)
      { m_current++;
        m_data[m_current] = data;
        return true;
      }
      else
      { return false; }
    }

    bool pop(DataType &data)
    { if (m_current==-1)
      { cout << "Nothing to pop";
        return false;
      }
      else
      { data = m_data[m_current];
        m_current--;
        return true;
      }
    }

    ///////////////////////////////////////
    /// Methods to access the private m_data
    ///////////////////////////////////////

    bool retrieveat(size_t index, DataType &data)
    {
      if (index>=m_size)
      {
        return false;
      }
      data = m_data[index];
      return true;
    }

    int retrievecurrent()
    {
        return m_current;
    }

    size_t retrievesize()
    {
        return m_size;
    }

private:

    DataType* m_data;
    size_t m_size;
    int m_current;
};