2013-04-03 3 views
2

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

Я пытаюсь объявить массив (с именем «array») в моем заголовочном файле, и я продолжаю получать некоторые нечетные ошибки. Когда я объявляю его публично как «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(); 
}` 

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

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

+2

Эта перегрузка 'operator []' не соответствует соответствующей значению lvalue или rvalue. – chris

+1

@chris: Мне все хорошо. Немного странно иметь оператор 'operator []' return by value, но он должен быть действительным. –

+0

@BillyIneal, Если это значение rvalue, это должна быть функция 'const'. – chris

ответ

3

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^