2014-04-01 103 views
0
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函數之後再次推入數據時,程序崩潰。

回答

0

我應該從哪裏開始......現在,這不是一個矢量類,但類。

你的代碼有很多問題,但爲了解決你最初的問題,你不應該在你的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; 
};