2013-04-05 96 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