Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > l-value


Автор: nns2009 19.2.2009, 16:04
Разрабатываю класс со связанным списком, доступ к которому осуществляется как к массиву.
Всё шло хорошо пока я только читал данные из связанного списка с помощью оператора [],
но когда мне понадобилось изменить значения(в четырёх местах), компилятор выдал мне 4 ошибки:
c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(800) : error C2106: '=' : left operand must be l-value
c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(801) : error C2106: '=' : left operand must be l-value
c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(805) : error C2106: '=' : left operand must be l-value
c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(806) : error C2106: '=' : left operand must be l-value

Вот реализация класса:
Код

class time
{
public:
    bool isNull;
    int x_start;
    int y_start;
    int lenght;
    int pas;
    time* nt;
    time()
    {
        isNull = true;
        nt = NULL;
        x_start = 0;
        y_start = 0;
        lenght = 1;
        pas = 0;
    }
    time(int xs, int ys, int l, int p)
    {
        isNull = false;
        nt = NULL;
        x_start = xs;
        y_start = ys;
        lenght = l;
        pas = p;
    }
    void Add(int xs, int ys, int l, int p)
    {
        if (isNull)
        {
            isNull = false;
            nt = NULL;
            x_start = xs;
            y_start = ys;
            lenght = l;
            pas = p;
            return;
        }
        time* twa = this;
        while(twa->nt != NULL) twa = twa->nt;
        twa->nt = new time(xs, ys, l, p);
    }
    void Delete(int ntd)
    {
        time* twa = this;
        time* to_what;
        for (int i = 0; i < ntd-1; i++)
        {
            if (twa->nt != NULL) twa = twa->nt;
            else return;
        }
        if (twa->nt == NULL) return;
        if (twa->nt->nt == NULL)
        {
            delete [] twa->nt;
            twa->nt = NULL;
            return;
        }
        else
        {
            to_what = twa->nt->nt;
            delete [] twa->nt;
            twa->nt = to_what;
            return;
        }
    }
    time operator [](int index)
    {
        time* twa = this;
        for (int i = 0; i < index; i++)
        {
            if (twa->nt == NULL) return *(twa->nt);
            twa = twa->nt;
        }
        return *twa;
    }
};

А вот - присваивания:
Код

int absp = second_pnt.y*width_of_table+second_pnt.x - indent_of_at;
if (absp >= 0)
{
    times[active_time].x_start = absp % width_of_table;
    times[active_time].y_start = absp / width_of_table;
}
else
{
    times[active_time].x_start = absp % width_of_table + width_of_table;
    times[active_time].y_start = (absp+1) / width_of_table - 1;
}

Подскажите пожалуйста, что значит l-value, как исправить мою ошибку, ну и есть ли в моём классе какие-либо вычислительные ошибки(по поводу связанного списка)?

Автор: Andrey44 19.2.2009, 16:37
Цитата

Error Message
'operator' : left operand must be l-value


The operator must have an l-value as its left operand. 

The following sample generates C2106:

  Copy Code 
// C2106.cpp
int main() {
   int a;
   1 = a;   // C2106
   a = 1;   // OK
}
 


Перегрузи оператор =

Автор: math64 19.2.2009, 16:50
operator[] должен возвращать time&, а не time или const time&

Автор: nns2009 20.2.2009, 16:40
Цитата(math64 @  19.2.2009,  16:50 Найти цитируемый пост)
operator[] должен возвращать time&, а не time или const time& 

Спасибо, теперь всё работает.


Цитата(Andrey44 @  19.2.2009,  16:37 Найти цитируемый пост)
Перегрузи оператор = 

А что мне это дало бы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)