1

ベクター クラス テンプレートを作成し、従業員の時間単位のクラスとサラリーマン クラスを既に作成しました。従業員ポインターの配列の代わりに従業員ポインターのベクトルを使用したいのですが、それを実行しようとしていますが、エラーがリストされていないときに実行すると壊れてしまいます。また、at関数 like( payroll.at(i)->writeFile(out);) を使用して要素にアクセスしましたが、何が問題なのかわかりません。なにか提案を?ありがとう

これが私のコードです: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( );
}
4

1 に答える 1

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

于 2013-04-05T06:46:03.467 に答える