Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
1

Error C2106: '=' : left operand must be l-value

24.04.2016, 17:05. Показов 5488. Ответов 31
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Пишу программу управления колледжом. И столкнулась с этой ошибкой.

У меня есть класс Department который имеет массив указателей на Course:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Department
{
    static Department* p_department;    
private:
    string name_department;
    long id_department; 
    Course** p_course;
    int count_course;
    Department(const Department& d);
    void operator = (const Department& d);
public: 
    Department();
    static Department* instance();
    ~Department();  
    void set(string name_department, long id_department);
    long get_id_department() const { return id_department; }
    int get_count_course() const { return count_course; }
    Course** get_p_course() { return p_course; }
    friend ostream& operator << (ostream &os, const Department* p_department);
    friend istream& operator >> (istream &is, Department* p_department);
    friend void operator += (Department* p_department,const Course& temp);
 
};
И в нем я пытаюсь перегрузить оператор += который добавляет Course в Department:
C++
1
2
3
4
5
6
7
8
9
10
11
void operator += (Department* p_department, const Course& temp)
{
    int count_course = p_department->get_count_course();
    if (!count_course)
    {
        p_department->get_p_course() = new Course*[count_course + 1]; //здесь выдает ошибку
        p_department->get_p_course()[0] = Course::instance();
        cin >> p_course[0];
        count_course++;
    }
...
Ошибка появляется тогда когда я хочу получить указатель на курсы и создать массив.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2016, 17:05
Ответы с готовыми решениями:

Error C2106: '=' : left operand must be l-value
Всем привет. Вот у меня есть такой хедер: #ifndef MATRIXX_H #define MATRIXX_H #include...

error C2106: '=' : left operand must be l-value выдаёт ошибку на сортировку
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() {...

Error: lvalue required as left operand of assignment|
Программа перевода с 10-ой СИ в римскую.В строках начиная с 19 пишет &quot;error: lvalue required as...

[Error] lvalue required as left operand of assignment
Задание Ошибка при компиляции. 28 14 lvalue required as left operand of assignment...

31
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
25.04.2016, 14:00 2
get_p_course() возвращает значение указателя. Естественно, ему нельзя присвоить.
1
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
25.04.2016, 16:39  [ТС] 3
+= friend потому что я использую его в другом классе. В классе College.
И в классе College есть массив указателей Department**. И мне нужно перегрузить += чтобы так добавлять Course в Department.

Добавлено через 8 минут
И компилятор ругается из-за оператора:

Error C2803 'operator +=' must have at least one formal parameter of class type

Добавлено через 2 минуты
Спасибо большое!Исправила:

C++
1
2
Course** arr=p_department->get_p_course();
arr = new Course*[count_course + 1];
Добавлено через 14 минут
Попробовала сделать так:
C++
1
2
3
4
5
6
void operator += (Department& p_department, const Course& c)
{
//...
    Course** arr=p_department.get_p_course();
    arr = new Course*[count_course + 1];
}
И тогда в классе College чтоб записать Course в Department нужно так?????
C++
1
*p_department[i] += temp;
Добавлено через 49 минут
И вот почему то в файле Department.h вылазит полно синтаксических ошибок:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define _CRT_SECURE_NO_WARNINGS
#ifndef DEPARTMENT_H
#define DEPARTMENT_H
#include "Course.h"
#include <iostream>
#include <string>
using namespace std;
 
class Department
{
    static Department* p_department;    
private:
    string name_department;
    long id_department; 
    Course** p_course; //Error C2143 syntax error: missing ';' before '*'
                                      //Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int
                                      //Error C2238 unexpected token(s) preceding ';'   
    int count_course;
    Department(const Department& d);
    void operator = (const Department& d);
public: 
    Department();
    static Department* instance();
    ~Department();  
    void set(string name_department, long id_department);
    string get_name() const { return name_department; } 
    long get_id_department() const { return id_department; }
    int get_count_course() const { return count_course; }
    Course** get_p_course() { return p_course; } //Error C2143 syntax error: missing ';' before '*'
                                                                             //Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int
                                                                             //Error    C2238 unexpected token(s) preceding ';'
    void set_count_course(int count_course) { this->count_course = count_course; }  
    friend ostream& operator << (ostream &os, const Department* p_department);
    friend istream& operator >> (istream &is, Department* p_department);
    friend void operator += (Department& p_department,const Course& c); //Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int
                                                                                                                   //Error  C2143 syntax error: missing ',' before '&'
 
};
 
#endif
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
25.04.2016, 18:08 4
Цитата Сообщение от Alonka Посмотреть сообщение
+= friend потому что я использую его в другом классе.
И что? Оно и без friend должно работать.
Оператор должен видеть все поля класса напрямую, поэтому get_p_course() не нужен, просто p_department.p_course.

Ошибки эти, наверное, из-за того, что не видит этот Course как тип.

А добавление в массив указателей потребует выделять память с учётом добавления, потом всё копировать, удалять старое и заменять p_course. Сделать так, как у тебя, значит потерять все данные, ещё и утечка памяти будет.
1
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
26.04.2016, 09:53  [ТС] 5
Спасибо большое!

Разобралась вроде с operator +=:

C++
1
void operator += (const Course& c);
Но все не пойму насчет этих синтаксических ошибок в Department.h. Почему он не видит Course как тип?
Я же сделала #include "Course.h" и в самом коде он слово Course выделяет цветом как нужно. Ошибки эти появляются только после того как я хочу запустить программу.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
26.04.2016, 10:01 6
Из этого фрагмента не ясно.
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
26.04.2016, 10:09  [ТС] 7
Цитата Сообщение от nmcf Посмотреть сообщение
Из этого фрагмента не ясно.
Исправила буквально только что!
Оказалось что в Course.h я сделала include "Department.h".
Удалила include "Department.h" и все заработало.

Спасибо огромное за помощь!!!Буду делать дальше.Надеюсь поможешь если еще возникнут вопросы!!

А насчет массивов указателей. Я делаю как создаю new копирую в temp добавляю еще один объект и потом обратно создаю new и копирую все туда. Ну и конечно delete. А другого способа я даже и не знаю.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
26.04.2016, 10:41 8
Ну там не было ни копирования, ни освобождения, просто присваивалось.
1
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
27.04.2016, 14:07  [ТС] 9
У меня возник один вопрос.
Как можно сделать ввод данных которые вводятся подряд через enter и потом вся скажем пачка считывается перегруженным оператором ввода.
C++
1
2
3
4
5
6
7
cout << "Please enter student details." << endl;
cout << "Name:";        
cout << "Code:";                        
cout << "Sex:";                     
cout << "Age:";
Student temp;
cin >> temp;
Добавлено через 20 минут
Цитата Сообщение от Alonka Посмотреть сообщение
У меня возник один вопрос.
Как можно сделать ввод данных которые вводятся подряд через enter и потом вся скажем пачка считывается перегруженным оператором ввода.
C++
1
2
3
4
5
6
7
cout << "Please enter student details." << endl;
cout << "Name:";        
cout << "Code:";                        
cout << "Sex:";                     
cout << "Age:";
Student temp;
cin >> temp;
Короче перегрузила просто по другому сам оператор ввода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream& operator >> (istream &is, Student& s)
{
    cout << "Please enter student details." << endl;
    cout << "Name:";
    is >> s.name_student;
    cout << "Code:";
    is >> s.id_student;
    cout << "Sex:";
    is >> s.sex_student;
    cout << "Age:";
    is >> s.age_student;
    return is;
}
Добавлено через 3 часа 14 минут
Еще вопрос появился.
Хочу перегрузить оператор []:
C++
1
Student& operator [] (int index_student) { return *p_student[index_student]; }
И потом перегружаю оператор -= кторый удаляет Student с Course и получаю ошибку access violation reading location:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Course::operator-=(const Student & s)
{
    Student** temp = new Student*[count_student - 1];   
    int index = s.get_p_student() - *p_student;
    for (int i = 0; i < index; i++)
    {
        temp[i] = p_student[i];
    }
    for (int i = 0; i < count_student - 1; i++)
    {
        temp[i] = p_student[i + 1];
    }
    delete[] p_student[index]; //access violation reading location
    delete[] p_student;
    p_student=temp;
}
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
27.04.2016, 15:11 10
А что такое p_student? Второй цикл идёт поверх первого, тогда зачем он? Учитывая, что здесь указатели, оператор [] вообще не применяется.
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
27.04.2016, 18:23  [ТС] 11
p_student это Student** p_student массив указателей который находиться в class Course.
Тоесть студенты которые учатся на этом курсе.
И мне надо сделать так чтоб можно было удалить студента с курса.
И для этого перегрузить оператор -= в class Course чтоб он удалял студента по индексу.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
27.04.2016, 18:50 12
А почему двумерный массив? Одномерного мало, что ли, для списка студентов? get_p_student() что возвращает? Выражение в 4-й строке сомнительно.
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
27.04.2016, 18:55  [ТС] 13
Student** p_student это так по условию задания.

C++
1
Student** get_p_student() const { return p_student; }
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
27.04.2016, 21:25 14
Ты же эту функцию относительно Student вызываешь. Каждый Student хранит указатель на массив всех Student, что ли?

Добавлено через 3 минуты
Вот это что?
C++
1
    int index = s.get_p_student() - *p_student;
Один p_student у Course, это понятно. А у s он откуда? И здесь получается (Student** - Student*), разные указатели.
1
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
28.04.2016, 09:45  [ТС] 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Course
{
    static Course* p_course;    
private:
    string name_course;
    long id_course; 
    Student** p_student;
    int count_student;      
public: 
    Student** get_p_student() const { return p_student; }   
    Student& operator [] (int index_student) { return *p_student[index_student]; }
};
Тоесть get_p_student() вызывается из Course.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Student
{
    static Student* p_student;
private:
    string name_student;
    long id_student;
    char sex_student;
    int age_student;
    Course** p_course;
    int count_course;
    .
        .
        .
 
};
А это
C++
1
 int index = s.get_p_student() - *p_student;
я хочу получить индекс по которому находиться Student которого я хочу удалить.

Оператор -= получает объект s :

C++
1
*temp_course[j] -= *temp_student[k]; //это находится в College.cpp
Мы вводим id_course и id_student и если такие существуют то мы должны удалить temp_student[k].

Добавлено через 17 минут
Совсем забыла, и в Student.h есть

C++
1
Student* get_p_student() const { return p_student; }
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.04.2016, 10:17 16
В этом фрагменте get_p_student() вызывается для s, а s - Student. Так что он возвращает?
C++
1
2
3
4
void Course::operator-=(const Student & s)
{
    Student** temp = new Student*[count_student - 1];   
    int index = s.get_p_student() - *p_student;
Ну хорошо, для чего это статическое поле? Я так и не пойму, как эта разность работает.
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
28.04.2016, 10:18  [ТС] 17
Совсем забыла, и в Student.h есть
C++
1
Student* get_p_student() const { return p_student; }
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.04.2016, 10:20 18
Я прочитал. Для чего это? Какое предназначение у статического поля?
0
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 18
28.04.2016, 10:23  [ТС] 19
Что каждый объект Student возвращает указатель на себя. И везде используются не объекты а только указатели на них.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Student
{
    static Student* p_student;
private:
    string name_student;
    long id_student;
    char sex_student;
    int age_student;
    Course** p_course;
    int count_course;
    Department* p_department;
    Student(const Student& s);
    void operator = (const Student& s);
public:
    Student();
    static Student* instance();
    ~Student();
    void set(string name_student, long id_student, char sex_student, int age_student); //function set
    string get_name_student() const { return name_student; }
    long get_id_student() const { return id_student; }
    char get_sex_student() const { return sex_student; }
    int get_age_student() const { return age_student; }
    Student* get_p_student() const { return p_student; }
    bool operator == (long id_student);
    void operator += (const Course& c);
    friend ostream& operator << (ostream &os, const Student* p_student);
    friend istream& operator >> (istream &is, Student& s);
    Course* operator [] (int index_course) { return p_course[index_course]; }
};
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
28.04.2016, 10:28 20
Указатель на себя - this, а статическое поле будет общим для все объектов класса.

Добавлено через 1 минуту
Если ты передаёшь Student в функцию, можно просто взять указатель.
0
28.04.2016, 10:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2016, 10:28
Помогаю со студенческими работами здесь

Error: lvalue required as left operand of assignment. Не могу разобраться где ошибка
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int n, count = 0; for (n = 111; n...

Error C2106 или error C2440
Необходимо создать односвязный список из слов строки.Ошибка в 28 и 35 строке. Код: #include...

Lvalue required as left operand of assignment
Подскажите, пожалуйста. Можно ли так (точнее что-то подобное) сделать? template &lt;class T&gt; ...

Ошибка в методе, left operand maust be I-value
#include &quot;PrintClass.h&quot; #include &quot;Class.h&quot; #include &lt;iostream&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru