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

Приоритетная очередь и конструктор копии - C++

Восстановить пароль Регистрация
 
Eugen-S
 Аватар для Eugen-S
8 / 8 / 0
Регистрация: 06.11.2011
Сообщений: 122
06.10.2012, 17:27     Приоритетная очередь и конструктор копии #1
День добрый, форумчане!
Прошу просвятить в таком вопрос:
-имеется класс, и в мейне пытаюсь запихнуть объекты этого класса в очередь с приоритетом, появляется такая ошибка:

Error 1 error C2558: class 'student' : no copy constructor available or copy constructor is declared 'explicit'

Конструктор копии вроде как написан, не могу понять в чем проблема. Вот, прошу помочь с этим, и дать ответ на такой вопрос: когда добавляю "const" в конструктор копирования, перестает работать вообще, куча ошибок.. почему конст так влияет и как правильно ? не могу понять)

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
41
42
43
44
45
46
47
48
49
50
class student
{
    char name[50];
    float mark;
    char group [10];
 
public:
    student()
    {
        strcpy_s(this->name," ");
        mark = 0;
        strcpy_s(this->group," ");
    };
 
    student(const char* n,float m,const char* g)
    {
        strcpy_s(this->name,n);
        this->mark=m;
        strcpy_s(this->group,g);    
    };
    
    student(student & copy)
    {   
        strcpy_s(this->name,copy.getname());
        this->mark=copy.getmark();
        strcpy_s(this->group,copy.getgroup());
    };
 
    char * getname()
    {
        return this->name;
    };
 
    float getmark()
    {
        return this->mark;
    };
 
    char * getgroup()
    {
        return this->group;
    };
 
    bool operator > (student & r)
    {
        if(this->getmark()>r.getmark())
            return 1;
        return 0;
    };
};
и мейн

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int _tmain(int argc, _TCHAR* argv[])
{
    priority_queue <student> arr;
 
    student a("a",1,"b"),b("b",1,"b");
 
    arr.push(a);
    arr.push(b);
    
    cout<<arr.top().getname();
    arr.pop();
    cout<<arr.top().getname();
    arr.pop();
 
    return 0;
}
если ставлю

student(CONST student & copy), появляется куча ошибок, почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 17:27     Приоритетная очередь и конструктор копии
Посмотрите здесь:

C++ конструктор копии
конструктор копии и операторы C++
Конструктор копии C++
C++ конструктор копии
C++ Конструктор копии
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.10.2012, 17:37     Приоритетная очередь и конструктор копии #2
Цитата Сообщение от Eugen-S Посмотреть сообщение
появляется куча ошибок, почему?
Потому, что вызывается константный метод getmark(), который не определен.

1) Добавьте const в конструктор копирования
2) Приучайте себя все функции, которые не должны менять объект, опеределять с const квалификатором
3) Перегрузите operator< для класса
Eugen-S
 Аватар для Eugen-S
8 / 8 / 0
Регистрация: 06.11.2011
Сообщений: 122
06.10.2012, 17:41  [ТС]     Приоритетная очередь и конструктор копии #3
так а тот что последний - > не надо? ну..или меньше тоже стоит перегрузить? вот, в этом-то и беда, добавляю запись "конст" , оно подчеркивает все copy в конструкторе.. и пишет что не может преобразовать student & в const student & ..

3 IntelliSense: the object has type qualifiers that are not compatible with the member function
object type is: const student

вот такие ошибки появляются
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.10.2012, 17:46     Приоритетная очередь и конструктор копии #4
Цитата Сообщение от Eugen-S Посмотреть сообщение
так а тот что последний - > не надо? ну..или меньше тоже стоит перегрузить
Дефолтный компаратор - std::less, а он использует operator<

Цитата Сообщение от Eugen-S Посмотреть сообщение
добавляю запись "конст" , оно подчеркивает все copy в конструкторе
1) Внимательно прочтите пункт 2 поста #2
2) См. выше

А вообще, не нужны никакие get в конструторе. Обращайтесь напрямую. Да и this не к месту. Уберите, глаза режет.
Eugen-S
 Аватар для Eugen-S
8 / 8 / 0
Регистрация: 06.11.2011
Сообщений: 122
06.10.2012, 17:53  [ТС]     Приоритетная очередь и конструктор копии #5
не хочет никак( не понимаю что такое..

добавил и консты к методам, всё равно та же ошибка..

C
1
2
3
4
5
6
7
8
9
10
11
student(const student& copy)
    {   
        strcpy(name,copy.getname());
        mark=copy.getmark();
        strcpy(group,copy.getgroup());
    };
 
const char * getname()
    {
        return this->name;
    };
об этом же речь шла? всёравно та же ошибка(
или я опять не дочитал?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.10.2012, 17:57     Приоритетная очередь и конструктор копии #6
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class student
{
    char name[50];
    float mark;
    char group [10];
 
public:
    student(): mark(0)
    {
        strcpy(this->name," ");
        // mark = 0;
        strcpy(this->group," ");
    };
 
    student(const char* n,float m,const char* g):mark(m)
    {
        strcpy(this->name,n);
        // this->mark=m;
        strcpy(this->group,g);
    };
 
    student(const student & copy):mark(copy.mark)
    {
        strcpy(this->name,copy.name);
        // this->mark=copy.getmark();
        strcpy(this->group,copy.name);
    };
 
    char * getname()
    {
        return this->name;
    };
 
    float getmark() const
    {
        return this->mark;
    };
 
    char * getgroup()
    {
        return this->group;
    };
 
    bool operator > (student & r)
    {
        if(this->getmark()>r.getmark())
            return 1;
        return 0;
    };
    bool operator< (const student&) const
    {
        return true;
    }
};
Добавлено через 2 минуты
На примере getmark делайте все остальное.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2012, 18:05     Приоритетная очередь и конструктор копии
Еще ссылки по теме:

Почему не вызывается конструктор копии? C++
C++ Приоритетная очередь
Приоритетная очередь C++

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

Или воспользуйтесь поиском по форуму:
Eugen-S
 Аватар для Eugen-S
8 / 8 / 0
Регистрация: 06.11.2011
Сообщений: 122
06.10.2012, 18:05  [ТС]     Приоритетная очередь и конструктор копии #7
всё поправил, работает! хм, спасибо большое!) раньше не приходилось с таким работать, буду знать! +1
Yandex
Объявления
06.10.2012, 18:05     Приоритетная очередь и конструктор копии
Ответ Создать тему
Опции темы

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