2013-04-05 97 views
1

我已經創建了我的向量類模板,並且我已經完成了每小時的員工課程,並且我獲得了工資。我想使用僱員指針的向量而不是僱員指針的數組,我試圖做到這一點,但是當我運行它只是休息,而我沒有列出錯誤。 此外,我用at函數(payroll.at(i)->writeFile(out);)來訪問一個元素,但我不知道什麼是錯的。 有什麼建議嗎? 感謝使用員工指針向量的C++

這裏是我的代碼: myvector類模板:

#include <iostream> 
#include <string> 
#include <cassert> 
#include <algorithm> 

    const int CAPACITY = 4; 
    template <class T> 
    class MyVector { 
    public: 

    MyVector(); 
    MyVector(int size); 
    MyVector(int size, const T & initial); 
    MyVector(const MyVector<T> & v);  
    ~MyVector(); 

    int capacity() const; 
    int size() const; 
    void push_back(const T & value); 
    //T & operator[](unsigned int index); 
    MyVector<T> & operator=(const MyVector<T> &); 
    void clear(); 
    T at(int i); 

    friend ostream& operator<<(ostream &out, const MyVector<T>&); 


    private: 
    int applied; 
    int my_size; 
    int my_capacity; 
    T * buffer; 
    T * daArray; 
}; 

template<class T> 
MyVector<T>::MyVector() 
{ 
    my_capacity = 0; 
    my_size = 0; 
    buffer = 0; 
    applied = 0; 
} 

template<class T> 
MyVector<T>::MyVector(const MyVector<T> & v) 
{ 
    my_size = v.my_size; 
    my_capacity = v.my_capacity; 
    buffer = new T[my_size]; 
    for (int i = 0; i < my_size; i++) 
    buffer[i] = v.buffer[i]; 
} 

template<class T> 
MyVector<T>::MyVector(int size) 
{ 
    my_capacity = size; 
    my_size = size; 
    buffer = new T[size]; 
} 

template<class T> 
MyVector<T>::MyVector(int size, const T & initial) 
{ 
    my_size = size; 
    my_capacity = size; 
    buffer = new T [size]; 
    for (unsigned int i = 0; i < size; i++) 
    buffer[i] = initial; 
    //T(); 
} 

template<class T> 
MyVector<T> & MyVector<T>::operator = (const MyVector<T> & v) 
{ 
    delete[ ] buffer; 
    my_size = v.my_size; 
    my_capacity = v.my_capacity; 
    buffer = new T [my_size]; 
    for (int i = 0; i < my_size; i++) 
    buffer[i] = v.buffer[i]; 
    return *this; 
} 

template<class T> 
void MyVector<T>::push_back(const T & i) 
{ 
    if (my_capacity == 0) 
    { 
    my_capacity = 1; 
    my_size = 1; 
    applied= 0; 
    buffer = new T[1]; 
    buffer[0] = i; 
    } 
    else 
    { 
    if (applied+1 == my_capacity) 
    { 
     int newCapacity = my_capacity * CAPACITY; 
     daArray = new T[newCapacity]; 
     for (int i = 0; i < my_size; i++) 
     { 
     daArray[i] = buffer[i]; 
     } 
     my_capacity = newCapacity;  
     delete buffer; 
     my_size++; 
     applied++; 
     buffer[applied] = i; 
    } 
    else 
    { 
     if (my_size == applied + 1) 
     my_size++; 
     applied++; 
     buffer[applied] = i; 
    } 
    } 
} 

template<class T> 
int MyVector<T>::size()const// 
{ 
    return my_size; 
} 

template<class T> 
int MyVector<T>::capacity()const 
{ 
    return my_capacity; 
} 

template<class T> 
MyVector<T>::~MyVector() 
{ 
    delete[ ] buffer; 
} 

template <class T> 
void MyVector<T>::clear() 
{ 
    my_capacity = 0; 
    my_size = 0; 
    buffer = 0; 
} 

template <class T> 
T MyVector<T>::at(int i) 
{ 
    if (i < 0 || i > my_size -1) 
    { 
    string error = "Index is undefined"; 
    throw error; 
    } 
    return buffer[i]; 
} 

template <class T> 
ostream& operator<<(ostream &out, const MyVector<T>& v) 
{ 
    for (unsigned i = 0; i < v.size(); i++) 
    { 
    out << v[i] << " "; 
    } 
    return out; 
} 

主要

int main() { 
    MyVector< employee*> payroll; 
    payroll.push_back(new Hourly ("H. Potter", "Privet Drive", "201-9090", 40, 12.00)); 
    payroll.push_back(new Salaried ("A. Dumbledore", "Hogewarts", "803-1230", 1200)); 

    ofstream out; 
    out.open(file); 

    if (out.fail()) { 
    cout<<" could not open the file"<<endl; 
    system("PAUSE"); 

    } 

    for (int i = 0; i < SIZE; i++) { 
    payroll.at(i)->writeFile(out); 
    } 
    out.close(); 
} 
+0

首先,學習如何使用調試器(例如'在Linux上gdb')。編譯所有警告和調試信息(例如Linux上的'g ++ -Wall -g')。改進代碼直到沒有警告。瞭解智能指針。考慮使用最新的C++ 2011標準(所以選擇一個合適的編譯器支持它,例如GCC 4.7或GCC 4.8)。 – 2013-04-05 06:42:14

+0

爲什麼把東西放入數組中然後將它們放入你的矢量中?爲什麼不簡單地執行'payroll.push_back(新小時(「H. Potter」,「Privet Drive」,「201-9090」,40,12.00));'直接? – Yuushi 2013-04-05 06:44:59

+0

Yuushi相信我,我已經嘗試過,但沒有工作! – Mido 2013-04-05 06:48:57

回答

1

你在你的push_back方法的錯誤。你需要像這樣

if (applied+1 == my_capacity) 
{ 
    int newCapacity = my_capacity * CAPACITY; 
    daArray = new T[newCapacity]; 
    for (int i = 0; i < my_size; i++) 
    { 
     daArray[i] = buffer[i]; 
    } 
    my_capacity = newCapacity; 
    delete buffer; 
    buffer = daArray; // new line here 
    my_size++; 
    applied++; 
    buffer[applied] = i; 
} 

看到我已經把評論// new line here

+0

&約翰請你澄清一下! – Mido 2013-04-05 06:57:05

+0

在你的代碼中你創建了一個新的數組''daArray',然後你將所有內容從'buffer'複製到'daArray',然後你刪除'buffer',但是你的代碼從不將緩衝區設置到新數組!即使它已被刪除並且'daArray'被丟棄,你也可以繼續使用'buffer'。你必須讓'buffer'指向新分配的數組,這就是我的代碼所做的。 – john 2013-04-05 07:00:32

+0

謝謝約翰你真的對我錯過了,現在它工作正常! – Mido 2013-04-05 07:28:08