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

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

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

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

23.01.2012, 17:34. Просмотров 1045. Ответов 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.
Я так понимаю, что из-за одинаковых имен операторов, преинкремент не наследуется. Как сделать, чтобы он наследовался?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
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?!
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,113
23.01.2012, 18:42     Наследование преинкремента в класс с постинкрементом #3
А ниче, что у тебя префиксный инкремент не определён?
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:46  [ТС]     Наследование преинкремента в класс с постинкрементом #4
Цитата Сообщение от NoMasters Посмотреть сообщение
А ниче, что у тебя префиксный инкремент не определён?
Определен в классе Counter. Класс Counter2 производный от него.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
23.01.2012, 18:55     Наследование преинкремента в класс с постинкрементом #5
если нужен ++i и i++ для Counter2, придется их оба определсять в Counter2. иначе Counter2::operator++(int) скрывает Counter1::operator++().
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
23.01.2012, 18:58  [ТС]     Наследование преинкремента в класс с постинкрементом #6
retmas, ну это ясно. Но может есть способ, при котором преинкремент всё же унаследуется в Counter2? Или задание не реализуемое?
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
23.01.2012, 18:58     Наследование преинкремента в класс с постинкрементом #7
Цитата Сообщение от retmas Посмотреть сообщение
иначе Counter2::operator++(int) скрывает Counter1::operator++()
Ну да, но функции то разные. Чудеса перегрузки, так сказать:
C++
1
2
void func();
void func(int);
Вот и остался вопрос почему
Цитата Сообщение от dimcoder Посмотреть сообщение
так происходит
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
23.01.2012, 19:27     Наследование преинкремента в класс с постинкрементом #8
нет тут чудес. ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка

Добавлено через 20 минут
Riderik, уточните, что вам нужно. преинкремент - определен только в базовом, а пост в производном? тогда используйте using
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;
}
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
23.01.2012, 19:36     Наследование преинкремента в класс с постинкрементом #10
Цитата Сообщение от retmas Посмотреть сообщение
нет тут чудес.
Согласен. Проверил с простыми функциями, то же самое.
Цитата Сообщение от retmas Посмотреть сообщение
сокрытие
хз что.
Цитата Сообщение от retmas Посмотреть сообщение
ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка
По идее функция наследуется, потом перегружается. А здесь как тогда? Есть мысли? Может ссылки со справкой?

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

Наследование, указатель на производный класс C++
C++ Наследование. Класс Круг и класс эллипс
C++ Присваивание результата преинкремента самой же переменной
C++ Создать класс «Авто», Наследование
разница между постинкрементом и преинкрементом C++

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

Или воспользуйтесь поиском по форуму:
dimcoder
Полярный
453 / 426 / 66
Регистрация: 11.09.2011
Сообщений: 1,126
24.01.2012, 10:12     Наследование преинкремента в класс с постинкрементом #12
silent_1991, спасибо, прояснили.
Yandex
Объявления
24.01.2012, 10:12     Наследование преинкремента в класс с постинкрементом
Ответ Создать тему
Опции темы

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