Как правильно перегрузить оператор << для возврата значения int? - PullRequest
0 голосов
/ 26 апреля 2018

Я не могу корректно перегрузить оператор <<.Это код, который у меня есть, и инструкции для моего задания будут ниже.Если вы укажете на другие ошибки, которые я допустил, это было бы любезно, НО мои вопросы: как мне правильно перегрузить мой оператор << в моем случае?

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

intacity // общее количество элементов, доступных в массиве данных

int * data // указатель на динамически размещенный массив данных

void addCapacity ();// приватная функция для выделения большего количества памяти при необходимости

Public:

IntCollection ()

~ IntCollection ()

IntCollection (const IntCollection & c)

void add (int value)

int get (int index)

int getSize ()

IntCollection & operator = (const IntCollection & c)

оператор bool == (const IntCollection & c)

IntCollection & operator << (значение int) </p>

Конструктор копирования.Конструктор копирования должен выполнить глубокое копирование объекта аргумента, то есть он должен создать IntCollection с тем же размером и емкостью, что и аргумент, с собственной полной копией массива данных аргумента.

Оператор присваивания (знак равноОператор присваивания также должен выполнить глубокое копирование объекта аргумента.Он должен возвращать себя (или, что более эффективно, ссылку на себя) для поддержки нескольких назначений в одной строке, например, a = b = c.Если вы сначала реализуете свой оператор присваивания, его можно использовать в конструкторе копирования, но это не является обязательным требованием.

Оператор Is Equals (==).Оператор «равно» должен возвращать значение «истина», если размер объекта аргумента совпадает с размером принимающего объекта, а значения в массивах данных обоих объектов идентичны.

Оператор вставки (<<),Оператор вставки должен добавить параметр int в принимающую IntCollection.Функциональность точно такая же, как и у функции add (), т.е. добавляет целые в коллекцию.Однако обратите внимание, что эта функция должна возвращать ссылку на себя, чтобы поддерживать несколько вставок в одной строке, например, c << 45 << -210.В отличие от оператора присваивания, этот возврат должен быть выполнен по ссылке, потому что каждая вставка фактически изменяет объект IntCollection, а вставка выполняется слева направо. </strong>

Деструктор.Функция add () вызывает addCapacity () для выделения памяти, когда ей нужно больше места.Нигде в этой программе память не освобождается с помощью delete [], что означает утечку памяти!Добавьте деструктор, который правильно обрабатывает это.

addCapacity.Обратите внимание, что addCapacity () является закрытой функцией-членом.Что произойдет, если вы попытаетесь вызвать его извне класса, то есть, добавив строку ниже к main ()?

1 Ответ

0 голосов
/ 26 апреля 2018

Вам необходимо вернуть *this, то есть объект, на котором ведется операция.Возврат «по ссылке» имеет тот же синтаксис, что и возврат «по значению»;единственное отличие состоит в добавлении & к объявлению функции, которое уже предоставлено.

Попробуйте это:

IntCollection& IntCollection::operator<<(int value)
{
  add(value);
  return *this; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...