【问题标题】:Custom vector's clear function自定义矢量的清除功能
【发布时间】:2014-04-01 13:43:16
【问题描述】:
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?

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

【问题讨论】:

  • 实数向量分别处理内存分配和该内存中元素的构造。然后清除操作只是破坏元素,但保留分配的内存。由于您同时执行这两项操作(new DataType[9999]),因此清除操作没有多大意义,因为您无法破坏元素(然后,delete[] 将是未定义的)。如果您将 delete[] 改为 clear,则您的容器似乎不会处于有效状态(默认构造)。

标签: c++ templates vector


【解决方案1】:

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

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

按照您的标准,可能是这样的:

void clear()
{
    m_current = -1;
}

看看这个经过修订的,但远未完成,sn-p。开心地完成它...

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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多