Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

Наследование преинкремента в класс с постинкрементом - C++

23.01.2012, 17:34. Просмотров 1078. Ответов 11
Метки нет (Все метки)

Дана задача: Написать класс Counter, реализовать в нем перегрузку преинкремента. В производном от него классе реализовать перегрузку постинкремента.
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
#include <iostream>
using namespace std;
 
class Counter
{
protected:
    int count;
public:
    Counter(int c=0): count(c) {}
    ~Counter(){}
    Counter &operator++() {count++; return (*this);}
};
 
class Counter2: public Counter
{
public:
    Counter2(int c=0):Counter(c) {}
    ~Counter2(){}
    Counter2 operator++(int){Counter2 tmp(*this); count++; return tmp;}
};
 
int main()
{
    Counter2 i=0;
    ++i;
}
Ошибка: error C2675: unary '++' : 'Counter2' does not define this operator or a conversion to a type acceptable to the predefined operator.
Указывает на строку с ++i.
Я так понимаю, что из-за одинаковых имен операторов, преинкремент не наследуется. Как сделать, чтобы он наследовался?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2012, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование преинкремента в класс с постинкрементом (C++):

Наследование: базовый класс Квадрат, производный класс Пирамида - C++
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ, член класса- длинна стороны. Предусмотреть в классе методы...

Абстрактный класс, наследование, класс хранится в другом классе - C++
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

разница между постинкрементом и преинкрементом - C++
не пойму разницу между count++ и ++count когда пишу count++, он выводит числа от 1 до 4, а когда пишу ++count, то он мне выводит числа от...

Наследование. Класс Круг и класс эллипс - C++
Здравствуйте уважаемые программисты. Нужно исправить ошибки в программе. Честно я в этом ничего не понимаю. Вот код программы: #include...

Присваивание результата преинкремента самой же переменной - C++
Заметил фишку: #include&lt;iostream&gt; int main() { int i=5; i= ++i + ++i + ++i; //получается 22, хотя должно быть 21, т.к....

Абстрактный класс. Наследование - C++
class polygon{ int height, width, point p; e_color color; public: virtual ~polygon(){} ...

11
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
23.01.2012, 18:34 #2
Интересная ситуация. Конечно можно в наследнике перегрузить этот оператор:
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
    public:
    
    A(int x) {count = x;}    
        
    void operator++ ()
    {
        ++count;
    }
    
    /*A operator++ (int)
    {
        A tmp = (*this); 
        count++; 
        return tmp;
    }*/
    
    private:
    int count;
};
 
class B: public A
{
    public:
    B(int x) : A(x)
    {
    }
    
    void operator++ ()
    {
        A::operator++();
    }    
    
    B operator++ (int)
    {
        B tmp = (*this); 
        A::operator++(); 
        return tmp;
    }
};
 
int main(int argc, char *argv[])
{
    B b(0);
    b++;
    ++b;
    system("PAUSE");
    return EXIT_SUCCESS;
}
Но почему так происходит хз. Эксперты, где вы?

Хотя если не перегружать в наследнике ++ вообще, то всё наследуется:
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class A
{
    public:
    
    A(int x) {count = x;}    
        
    void operator++ ()
    {
        ++count;
    }
    
    private:
    int count;
};
 
class B: public A
{
    public:
    B(int x) : A(x)
    {
    }
};
 
int main(int argc, char *argv[])
{
    B b(0);
    ++b;
    system("PAUSE");
    return EXIT_SUCCESS;
}
WTF?!
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
23.01.2012, 18:42 #3
А ниче, что у тебя префиксный инкремент не определён?
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:46  [ТС] #4
Цитата Сообщение от NoMasters Посмотреть сообщение
А ниче, что у тебя префиксный инкремент не определён?
Определен в классе Counter. Класс Counter2 производный от него.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
23.01.2012, 18:55 #5
если нужен ++i и i++ для Counter2, придется их оба определсять в Counter2. иначе Counter2::operator++(int) скрывает Counter1::operator++().
1
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:58  [ТС] #6
retmas, ну это ясно. Но может есть способ, при котором преинкремент всё же унаследуется в Counter2? Или задание не реализуемое?
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
23.01.2012, 18:58 #7
Цитата Сообщение от retmas Посмотреть сообщение
иначе Counter2::operator++(int) скрывает Counter1::operator++()
Ну да, но функции то разные. Чудеса перегрузки, так сказать:
C++
1
2
void func();
void func(int);
Вот и остался вопрос почему
Цитата Сообщение от dimcoder Посмотреть сообщение
так происходит
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
23.01.2012, 19:27 #8
нет тут чудес. ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка

Добавлено через 20 минут
Riderik, уточните, что вам нужно. преинкремент - определен только в базовом, а пост в производном? тогда используйте using
1
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 19:35  [ТС] #9
retmas, Отлично, то что нужно, спасибо.

Добавлено через 32 секунды
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
#include <iostream>
using namespace std;
 
class Counter
{
protected:
    int count;
public:
    Counter(int c=0): count(c) {}
    ~Counter(){}
    Counter &operator++() {count++; return (*this);}
};
 
class Counter2: public Counter
{
public:
    using Counter::operator ++;
    Counter2(int c=0):Counter(c) {}
    ~Counter2(){}
    Counter2 operator++(int){Counter2 tmp(*this); count++; return tmp;}
};
 
int main()
{
    Counter2 i=0;
    ++i;
}
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
23.01.2012, 19:36 #10
Цитата Сообщение от retmas Посмотреть сообщение
нет тут чудес.
Согласен. Проверил с простыми функциями, то же самое.
Цитата Сообщение от retmas Посмотреть сообщение
сокрытие
хз что.
Цитата Сообщение от retmas Посмотреть сообщение
ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка
По идее функция наследуется, потом перегружается. А здесь как тогда? Есть мысли? Может ссылки со справкой?

Цитата Сообщение от retmas Посмотреть сообщение
используйте using
retmas, спасибо.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
23.01.2012, 22:17 #11
Цитата Сообщение от dimcoder Посмотреть сообщение
Есть мысли?
Вам же уже сказали, что это сокрытие. Но вы на это гордо ответили
Цитата Сообщение от dimcoder Посмотреть сообщение
хз что
Перегрузка была бы, если бы оба метода находились в одном классе. Но если есть метод в классе-родителе и одноимённый метод в классе-наследнике, то метод наследника не перегружает (создаёт новый вариант того же метода), а скрывает (создаёт полностью новое семейство методов, без возможности прямого доступа к методам родителя через объект наследника).
1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
24.01.2012, 10:12 #12
silent_1991, спасибо, прояснили.
0
24.01.2012, 10:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 10:12
Привет! Вот еще темы с ответами:

Класс точка(наследование) - C++
Тема:ПРоизводные классы.Наследование Создать класс Точка, которая имеет координаты. Класс Эллипсов, и класс Окружностей. Определить...

Наследование и абстрактный класс - C++
Вот сделал список с такими условиями #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; ...

Класс Car. Наследование - C++
1) У нас есть class Car --&gt; св-ва maxspeed, currentspeed. Методы Getmaxs(), Getcurrs() которые соответственно возвр. maxspeed и...

Класс бинарных деревьев. Наследование - C++
Доброго времени суток! Имеется задание написать абстрактный класс бинарного дерева и класс рациональных чисел. От них отнаследовать классы...


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

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

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