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 = 0
和int m_current = -1
。但是你如何重置m_data?
当我想在调用delete [] m_data
函数后再次推送数据时,尝试clear
会使程序崩溃。
答案 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;
};