Реализация класса массива C ++ - PullRequest
1 голос
/ 07 марта 2011

Для школы мне дали интерфейс класса, чтобы определить мой собственный класс массива (не наследуется).

У меня проблемы с перегрузкой оператора присваивания (=) и оператора сравнения (==), а также оператора индекса.

Это было дано мне в интерфейсе класса:

Array& operator = (Array const& array1);   // overload assignment operator
bool operator == (Array const& array1);    // overload == operator

int const& operator [] (unsigned int index) const;   // overload index operator
int& operator [] (unsigned int index);      // overload index operator

То, что я не могу понять, это как назначить это. Если массив, который вы хотите присвоить новой переменной, передается функции = как вы возвращаете значение этого массива, чтобы присвоить ему новую переменную. Или я просто выделяю новую ячейку памяти, и она автоматически назначает ее так называемой функции?

С помощью оператора == как узнать, с чем он сравнивается? Как я могу сравнить значения, я не знаю, как ссылаться на то, что вызвало функцию?

Я почти не знаю, как перегрузить оператор индекса. Если переменная, использующая оператор индекса, указывает на первое целое в массиве, как мне увеличить его, чтобы вернуть значение индекса, который был вызван?

Не говоря уже, я не уверен, для чего именно мы его перегружаем, и две перегрузки двух операторов индекса выглядят одинаково. Я не знаю, что для них сделать.

Мой учитель сказал мне, что оператор присваивания похож на конструктор копирования, который я написал так:

Array::Array(Array const& oldarray)
{
   int *arraycopy;
   arraycopy = new int[oldarray.length] // length is a member variable that has already been initiated
   for(int i = 0; i < oldarray.length; i++) {
      arraycopy[i] = oldarray[i];
   }
}

Это то же самое для оператора присваивания? Меня смущает все это, и я буду очень признателен за любую помощь! Спасибо!

Ответы [ 4 ]

4 голосов
/ 07 марта 2011

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

Оператор присваивания:

Array& operator = (Array const& array1);

Этот оператор означает «назначить array1 на this», он также известен как «оператор копирования». Обычно это делается путем копирования array1 в this в зависимости от типа данных. Это может быть достигнуто с помощью memcpy для базовых массивов.

Оператор сравнения:

bool operator == (Array const& array1);

Опять же, это означает "сравнить this с array1". Это должно быть довольно просто - используйте любую логику, которую использует тип данных, чтобы определить, совпадают ли данные в this с данными в array1. Это может быть достигнуто с помощью memcmp для базового типа массива.

Индекс операторов

int& operator [] (unsigned int index);
int const& operator [] (unsigned int index) const;

Это в основном один и тот же оператор, однако один из них - версия "только для чтения", где вы не можете записывать в массив.

Этот оператор может вводить в заблуждение, поскольку он не означает «поместить элемент в индекс», а означает «дать мне ссылку на индекс, где я могу поместить свой элемент». Это означает, что присвоение выполняется извне, например, оператор:

myarray[idx] = item;

На самом деле это два утверждения (примечание: предполагается, что ваш класс Array является массивом int s):

// Reference to the index location
int& writeLocation = myarray[idx];

// Write item to the location
writeLocation = item;

Реализация этого оператора зависит от реализации вашего типа данных.

2 голосов
/ 07 марта 2011

С помощью оператора присваивания ваш массив уже может быть выделен (т. Е. Размер> 0).Поэтому вам необходимо освободить любую существующую память / или какую-либо другую схему, чтобы убедиться, что оба ваших массива имеют одинаковый размер.Оператор присваивания должен возвращать *this, чтобы вернуть ссылку на текущий массив для таких вещей, как цепочка присваивания.

Для bool operator == (Array const& array1); вы хотите сравнить все значения в массиве 1 с this (вызываемый объект).Вы могли бы немного оптимизировать это, сначала сравнив размеры массивов, чтобы убедиться, что они одинаковы.

0 голосов
/ 07 марта 2011

В общем случае оператор присваивания выглядит как

Array& Array::operator = (Array const& rhs)
{
    if (*this != rhs) // prevent self-copying
    {
        delete[] this->array;
        this->array = new int[rhs.length];
        //copy array;
        // copy all other members - if they are pointers, don't forget to free memory first;
    }
    return *this;
}
0 голосов
/ 07 марта 2011

когда вы пишете:

a = b; 

Ваш компилятор c ++ вызывает:

a.operator=(b). 

Поэтому в вашей реализации operator=() вам необходимо присвоить значение объекта b объекту a (изатем верните а).Помните, что в функции-члене к a можно получить доступ через указатель this.

...