我似乎无法正确重载<<运算符。这是我到目前为止的代码,有关我的分配的说明,将在下面进行介绍。如果您指出我犯的其他错误将是一种错误,但是我的问题是在我的情况下如何正确重载<<运算符?

INTCOLLECTION.h:

#ifndef INTCOLLECTION_H
#define INTCOLLECTION_H

// Allocate memory in chunks of ints of this size.
const int CHUNK_SIZE = 5;

class IntCollection
{
  private:
  // The number of ints currently stored in the int
    int size;
  // the total number of elements available for storage
  // in the data array
    int capacity;
  // A pointer to the dynamically allocated data array
    int* data;
  // a private member function to allocate more memory
  // if necessary
    void addCapacity();
  public:
  // Constructor
    IntCollection();
  // Destructor
    ~IntCollection();
  // Copy constructor:
    IntCollection(const IntCollection &c);

    void add(int value);
    int get(int index);
    int getSize();
    IntCollection& operator=(const IntCollection &c);
    bool operator==(const IntCollection &c);
    IntCollection& operator<<(int value);
};

#endif


INTCOLLECTION.cpp:

#include "IntCollection.h"
#include <iostream>
#include <cstdlib>
using namespace std;

IntCollection::IntCollection()
{
  // Initialize member data to reflect an empty
  // IntCollection
  size = capacity = 0;
  data = NULL;
}

IntCollection::~IntCollection()
{
  delete [] data;
}

IntCollection::IntCollection(const IntCollection &c)
{
  size = c.size;
  capacity = c.capacity;
  data = c.data;

  for(int i = 0; i < c.size; i++)
  {
    data[i] = c.data[i];
  }
}

void IntCollection::addCapacity()
{
  // Create a new, bigger buffer, copy the current data to
  // it, delete the old buffer, and point our data
  // pointer to the new buffer
  int *newData;
  data = new int[capacity];
  capacity += CHUNK_SIZE;
  newData = new int[capacity];

  for(int i = 0; i < size; i++)
  {
    newData[i] = data[i];
    delete [] data;
    data = newData;
  }
}

void IntCollection::add(int value)
{
  //first, allocate more memory if we need to
  if(size == capacity)
  {
    addCapacity();
  }
  //Now, add the data to our array and increment size
  data[size++] = value;
}

int IntCollection::get(int index)
{
  if (index < 0 || index >= size)
  {
    cout << "ERROR: get() trying to access index out of range.\n";
    exit(1);
  }
  return data[index];
}

int IntCollection::getSize()
{
  return size;
}

IntCollection& IntCollection::operator=(const IntCollection &c)
{
  size = c.size;
  capacity = c.capacity;
  data = c.data;

  return *this;
}

bool IntCollection::operator==(const IntCollection &c)
{
  if((size == c.size) && (capacity == c.capacity))
  {
    for(int m = 0; m < size; m++)
    {
      if(data[m] == c.data[m])
      {
        continue;
      }
      else
      {
        return false;
      }
    }
  }
  return true;
}

IntCollection& IntCollection::operator<<(int value)
{
  return value; // <-- THIS IS WHERE I GET LOST!
  /* I also tried changing the parameters to
  (IntCollection &b, int value) to return b
  but my teacher wants only one parameter
  and it wasn't working that way either. */
}


说明:


  对于此分配,您将向IntCollection类添加一个副本构造函数,一个析构函数和三个重载运算符。在下面的设计图中,黑色成员函数表示已经实现的代码。您将实施绿色项目。图表下方说明了您要添加到班级的每个项目。
  
  私人的:
  
  int size //当前存储在int集合中的int数
  
  int容量//数据数组中可用的元素总数
  
  int * data //指向动态分配的数据数组的指针
  
  void addCapacity(); //私有函数在必要时分配更多的内存
  
  上市:
  
  IntCollection()
  
  〜IntCollection()
  
  IntCollection(const IntCollection&c)
  
  void add(int值)
  
  int get(int索引)
  
  int getSize()
  
  IntCollection&运算符=(const IntCollection&c)
  
  布尔运算符==(const IntCollection&c)
  
  IntCollection&运算符<  
  复制构造函数。复制构造函数应执行参数对象的深层复制,即,它应构造一个与参数相同大小和容量的IntCollection,并带有其自己的参数数据数组的完整副本。
  
  赋值运算符(=)。赋值运算符还应该执行自变量对象的深层副本。它必须返回自身(或更有效地是对自身的引用),以支持同一行上的多个分配,例如a = b = c。如果首先实现您的赋值运算符,则可以在复制构造函数中使用它,但这不是必需的。
  
  Is Equals运算符(==)。如果自变量对象的大小与接收对象的大小相同,并且两个对象的数据数组中的值相同,则“等于”运算符应返回true。
  
  插入运算符(<  
  析构函数。当需要更多空间时,函数add()调用addCapacity()分配内存。在该程序中,没有地方用delete []释放了内存,这意味着我们发生了内存泄漏!添加一个可以正确处理此析构函数的析构函数。
  
  addCapacity。请注意,addCapacity()是私有成员函数。如果您尝试从类外部调用它,即通过将以下行添加到main()会发生什么?

最佳答案

您需要返回*this,即正在操作的对象。返回“按引用”的语法与返回“按值”的语法相同;唯一的区别在于已在函数声明中添加了&

尝试这个:

IntCollection& IntCollection::operator<<(int value)
{
  add(value);
  return *this;
}

09-30 12:54