Недопустимое использование нестатического члена данных (массив)

Я очень плохо знаком с C++, так что это может быть довольно нудистской проблемой, но у меня проблемы с поиском решения. Я искал ответ, и TA, кажется, имеет логически эквивалентный, но загадочно работающий код, и мы не можем понять, почему.

Я пытаюсь объявить массив (названный 'массивом) в моем заголовочном файле, и я продолжаю получать некоторые странные ошибки. Когда я объявляю это публично как "int* array;" или "int array[];", конструктор говорит мне, что это недопустимое использование нестатического члена данных. Когда я объявляю его закрытым, он жалуется, что элементы массива являются закрытыми.

Назначение имеет дело с перегрузкой операторов и имеет дело с массивами с нечетными индексами, такими как от -3 до 5. Ниже приведен код, относящийся к проблеме:

// from the .cpp file
//constructor
IntArray::IntArray(int USER_DEFINED)
{
    if (USER_DEFINED < 1)
    {
        //return some kind of error
    }
    string name;
    setName();
    int lower = 0;
    int higher = USER_DEFINED - 1;
    array = new int[higher - lower];
    //int* p = &array[abs(lower)];
}

//overload
int IntArray::operator[](int i)
{
    if (i < lower || i > higher)
    {
        //return some sort of error
    }
    else
        return array[i - lower];
}

//from the .h file
class IntArray { 
     public: 
          int* array;
          int  operator[](int i);
};

//from the driver
void test1() {
    cout << "1. Array declared with single integer: IntArray a(10);" << endl << endl;
    csis << "1. Array declared with single integer: IntArray a(10);" << endl << endl;
    IntArray a(10);
    for(int i = a.low(); i <= a.high(); i++)
        a[i] = i * 10;
    a.setName("a");
    cout << a << endl;
    csis << a << endl;
    wait();
}`

a [i] = i * 10; где компилятор жалуется.

Заранее благодарю за любую помощь.

1 ответ

Ваш operator[] возвращает int, который возвращается вызывающей стороне в качестве неназванного временного объекта; "значение". (Исторически так называется, потому что это набор операций, разрешенных для выполнения в правой половине оператора присваивания)

Заявление как a[i] = i * 10; не имеет смысла, потому что вы будете изменять неназванный временный результат a[i], Если вы хотите, чтобы кто-то мог изменить int в памяти указал на IntArray::array, а затем вернуть ссылку.

Другие вопросы по тегам