Как я могу различить доступ к индексу массива и его присваивание? - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу класс динамического массива. Я перегрузил operator[] для доступа к указателю, содержащему данные в моем массиве. Также в моем классе есть член size, обозначающий количество объектов в массиве. Мне нужно иметь возможность добавлять элементы, назначая их через A[i], а также добавлять в начало или конец, используя функции-члены. Проблема в том, что при назначении с помощью A[i] = x я не знаю, чтобы увеличить size. Есть ли способ отличить, используется ли оператор [] в левой части = вместо простого доступа к этому индексу? Я включил упрощенную версию своей реализации.

using namespace std;
#include <iostream>
class Array
{
    public:
        [constructors, destructor];
        int& operator[](int index);
        [addToFront(),addToBack(), etc.]
    private:
        int size;     // holds the number of objects in the array
        int capacity;
        int* arr;     // ptr to the data in the array
}

int& Array::operator[](int index)    // overloaded array access operator
{
    return arr[index]; // simplified version of what I use
}

int main()
{
    Array A(6);    // initialize capacity using parameterized constructor
    A.addToFront(15); // addToFront() is able to increment size inside of its function
    A[1] = 10;    // How can I know that I am adding a new object to the array
    return 0;
}

Спасибо!

1 Ответ

0 голосов
/ 30 сентября 2019

Это можно сделать с помощью прокси-объекта. Вы можете перегружать operator = для этих объектов и делать более сложные вещи, такие как увеличение size внутри этой функции-члена. Пример:

class Array
{
   // Rest as before...

   struct Proxy {
     Array& ref;
     int pos;

     Proxy& operator =(int n)
     {
        ref.arr[pos] = n;
        ++ref.size;

        return *this;
     }
   };

   Proxy operator[](int index);
};

Реализация operator[] будет тогда

Array::Proxy Array::operator[](int index)
{
   return Proxy{*this, index};
}

и использованием, как показано в примерном фрагменте.

...