Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
24.04.2016, 17:05     Error C2106: '=' : left operand must be l-value #1
Добрый день! Пишу программу управления колледжом. И столкнулась с этой ошибкой.

У меня есть класс 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++;
    }
...
Ошибка появляется тогда когда я хочу получить указатель на курсы и создать массив.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
25.04.2016, 14:00     Error C2106: '=' : left operand must be l-value #2
get_p_course() возвращает значение указателя. Естественно, ему нельзя присвоить.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
25.04.2016, 16:39  [ТС]     Error C2106: '=' : left operand must be l-value #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
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
25.04.2016, 18:08     Error C2106: '=' : left operand must be l-value #4
Цитата Сообщение от Alonka Посмотреть сообщение
+= friend потому что я использую его в другом классе.
И что? Оно и без friend должно работать.
Оператор должен видеть все поля класса напрямую, поэтому get_p_course() не нужен, просто p_department.p_course.

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

А добавление в массив указателей потребует выделять память с учётом добавления, потом всё копировать, удалять старое и заменять p_course. Сделать так, как у тебя, значит потерять все данные, ещё и утечка памяти будет.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
26.04.2016, 09:53  [ТС]     Error C2106: '=' : left operand must be l-value #5
Спасибо большое!

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

C++
1
void operator += (const Course& c);
Но все не пойму насчет этих синтаксических ошибок в Department.h. Почему он не видит Course как тип?
Я же сделала #include "Course.h" и в самом коде он слово Course выделяет цветом как нужно. Ошибки эти появляются только после того как я хочу запустить программу.
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
26.04.2016, 10:01     Error C2106: '=' : left operand must be l-value #6
Из этого фрагмента не ясно.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
26.04.2016, 10:09  [ТС]     Error C2106: '=' : left operand must be l-value #7
Цитата Сообщение от nmcf Посмотреть сообщение
Из этого фрагмента не ясно.
Исправила буквально только что!
Оказалось что в Course.h я сделала include "Department.h".
Удалила include "Department.h" и все заработало.

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

А насчет массивов указателей. Я делаю как создаю new копирую в temp добавляю еще один объект и потом обратно создаю new и копирую все туда. Ну и конечно delete. А другого способа я даже и не знаю.
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
26.04.2016, 10:41     Error C2106: '=' : left operand must be l-value #8
Ну там не было ни копирования, ни освобождения, просто присваивалось.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
27.04.2016, 14:07  [ТС]     Error C2106: '=' : left operand must be l-value #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;
}
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
27.04.2016, 15:11     Error C2106: '=' : left operand must be l-value #10
А что такое p_student? Второй цикл идёт поверх первого, тогда зачем он? Учитывая, что здесь указатели, оператор [] вообще не применяется.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
27.04.2016, 18:23  [ТС]     Error C2106: '=' : left operand must be l-value #11
p_student это Student** p_student массив указателей который находиться в class Course.
Тоесть студенты которые учатся на этом курсе.
И мне надо сделать так чтоб можно было удалить студента с курса.
И для этого перегрузить оператор -= в class Course чтоб он удалял студента по индексу.
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
27.04.2016, 18:50     Error C2106: '=' : left operand must be l-value #12
А почему двумерный массив? Одномерного мало, что ли, для списка студентов? get_p_student() что возвращает? Выражение в 4-й строке сомнительно.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
27.04.2016, 18:55  [ТС]     Error C2106: '=' : left operand must be l-value #13
Student** p_student это так по условию задания.

C++
1
Student** get_p_student() const { return p_student; }
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
27.04.2016, 21:25     Error C2106: '=' : left operand must be l-value #14
Ты же эту функцию относительно Student вызываешь. Каждый Student хранит указатель на массив всех Student, что ли?

Добавлено через 3 минуты
Вот это что?
C++
1
    int index = s.get_p_student() - *p_student;
Один p_student у Course, это понятно. А у s он откуда? И здесь получается (Student** - Student*), разные указатели.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
28.04.2016, 09:45  [ТС]     Error C2106: '=' : left operand must be l-value #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; }
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
28.04.2016, 10:17     Error C2106: '=' : left operand must be l-value #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;
Ну хорошо, для чего это статическое поле? Я так и не пойму, как эта разность работает.
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
28.04.2016, 10:18  [ТС]     Error C2106: '=' : left operand must be l-value #17
Совсем забыла, и в Student.h есть
C++
1
Student* get_p_student() const { return p_student; }
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
28.04.2016, 10:20     Error C2106: '=' : left operand must be l-value #18
Я прочитал. Для чего это? Какое предназначение у статического поля?
Alonka
0 / 0 / 0
Регистрация: 17.04.2016
Сообщений: 17
28.04.2016, 10:23  [ТС]     Error C2106: '=' : left operand must be l-value #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]; }
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2016, 10:28     Error C2106: '=' : left operand must be l-value
Еще ссылки по теме:

Ошибка: lvalue required as left operand of assignment C++
Error C2106 или error C2440 C++
C++ Error: lvalue required as left operand of assignment|

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

Или воспользуйтесь поиском по форуму:
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,558
28.04.2016, 10:28     Error C2106: '=' : left operand must be l-value #20
Указатель на себя - this, а статическое поле будет общим для все объектов класса.

Добавлено через 1 минуту
Если ты передаёшь Student в функцию, можно просто взять указатель.
Yandex
Объявления
28.04.2016, 10:28     Error C2106: '=' : left operand must be l-value
Ответ Создать тему

Метки
c++
Опции темы

Текущее время: 20:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru