Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.06.2017
Сообщений: 18
1

Наследование. Перегрузка операторов

26.08.2019, 20:21. Показов 2747. Ответов 6

Не понятно, почему компилятор ругается на 49 строку - "отстутствует оператор "++", соответствующий этим операндам". В производном классе нет этого оператора, но он ведь описан в базовом классе.

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
55
56
57
58
59
60
61
#include <iostream>
using namespace std;
 
class Counter
{
protected: // заметьте, что тут не следует использовать private
    unsigned int count; // счетчик
public:
    Counter() : count() // конструктор без параметров
    { }
    Counter(int c) : count(c) // конструктор с одним параметром
    { }
    unsigned int get_count() const // получение значения
    {
        return count;
    }
    Counter operator++ () // оператор увеличения
    {
        return Counter(++count);
    }
};
///////////////////////////////////////////////////////////
class CountDn : public Counter
{
public:
    CountDn() : Counter() // конструктор без параметров
    { }
    CountDn(int c) : Counter(c)// конструктор с одним параметром
    { }
    CountDn operator-- () // оператор уменьшения
    {
        return CountDn(--count);
    }
    CountDn operator++ (int l) // оператор увеличения
    {
        return CountDn(count++);
    }
    CountDn operator-- (int t) // оператор уменьшения
    {
        return CountDn(count--);
    }
};
int main()
{
    CountDn c1; // переменные класса CountDn
    CountDn c2(100);
    cout << "\nc1 = " << c1.get_count(); // выводим значения на экран
    cout << "\nc2 = " << c2.get_count();
    ++c1; ++c1; ++c1; // увеличиваем c1
    cout << "\nc1 = " << c1.get_count(); // показываем результат
    --c2; --c2; // уменьшаем c2
    cout << "c2 = " << c2.get_count(); // показываем результат
    CountDn c3 = --c2; // создаем переменную c3 на основе c2
    cout << "\nc3 = " << c3.get_count(); // показываем значение
    c2--; c3++;
    cout << "c2 = " << c2.get_count(); // показываем результат
    cout << "\nc3 = " << c3.get_count(); // показываем значение
    cout << endl;
    system("pause");
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2019, 20:21
Ответы с готовыми решениями:

Наследование и перегрузка операторов
Помогите, пожалуйста! Ткните носом в ошибки.. не судите строго - первая прога в С++, как и в...

Наследование и перегрузка операторов.
У меня есть базовый класс class myfloat { protected: int c; int z; void reduce();...

ООП в С++ (наследование, инкапсуляция, полиморфизм, перегрузка операторов): что читать?
Нужно освежить, подзабылось. Были у меня институцкие методички доцента Шеховцова. Хороша вещь, но...

Нужен код, в котором есть: Классы, Наследование, Виртуальная функция, Перегрузка операторов
Скоро сдавать лабораторные работы, помогите пожалуйста)) Если можете, пришлите код, в котором есть:...

6
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
26.08.2019, 20:34 2
unknown_user1, получается что после инкремента твой объект CountDn превратиться в Counter?
C++
1
2
3
4
Counter operator++ () // оператор увеличения
{
    return Counter(++count);
}
Полагаю по этой причине наследование перегруженных операторов запрещены.
0
С чаем беда...
Эксперт CЭксперт С++
9074 / 4606 / 1250
Регистрация: 18.10.2014
Сообщений: 10,306
26.08.2019, 20:58 3
Лучший ответ Сообщение было отмечено unknown_user1 как решение

Решение

Цитата Сообщение от unknown_user1 Посмотреть сообщение
В производном классе нет этого оператора, но он ведь описан в базовом классе.
Это называется сокрытием имен. В производном классе есть оператор с именем ++ (постфиксный) и он скрывает оператор с таим же именем (префиксный) из базового класса.

Добавьте в производный класс

C++
1
using Counter::operator ++;
чтобы скрытый оператор снова стал видимым.

Цитата Сообщение от _stanislav Посмотреть сообщение
Полагаю по этой причине наследование перегруженных операторов запрещены.
С чего бы это вдруг? Наследование перегруженных операторов не запрещено.
1
Модератор
Эксперт С++
10872 / 8991 / 5408
Регистрация: 18.12.2011
Сообщений: 24,040
26.08.2019, 20:58 4
Вот так работает
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
    Counter operator++() // префиксный оператор увеличения
    {
        ++count;
        return *this;
    }
    Counter operator++(int) // постфиксный оператор увеличения
    {
        Counter c(*this);
        ++count;
        return c;
    }
....
    CountDn operator--() // префиксный  оператор уменьшения
    {
        --count;
        return *this;
    }
    
    CountDn operator--(int t) //  постфиксный оператор уменьшения
    {
        CountDn c(*this);
        ++count;
        return c;
    }
0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
26.08.2019, 21:24 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
С чего бы это вдруг? Наследование перегруженных операторов не запрещено.
я сделал довольно смелое предположение, мне показалось логичным запрета конвертации объекта после инкремента

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
Counter operator++() // префиксный оператор увеличения
тут не ссылку нужно возвращать?
0
Модератор
Эксперт С++
10872 / 8991 / 5408
Регистрация: 18.12.2011
Сообщений: 24,040
26.08.2019, 21:29 6
Для префиксного можно, конечно, и ссылку.
Но для постфиксного не получится.
0
"C with Classes"
1485 / 1287 / 485
Регистрация: 16.08.2014
Сообщений: 5,414
Записей в блоге: 1
26.08.2019, 21:30 7
Цитата Сообщение от zss Посмотреть сообщение
Для префиксного можно, конечно, и ссылку.
желательно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2019, 21:30

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Наследование операторов
Пожалуйста, подскажите как правильно задать оператор например =, в базовом классе, а вызывать в...

Перегрузка операторов
Никак не возьму в толк, почему оно не работает! // CG5.cpp : Defines the entry point for the...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.