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

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

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

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

23.01.2012, 17:34. Просмотров 1061. Ответов 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.
Я так понимаю, что из-за одинаковых имен операторов, преинкремент не наследуется. Как сделать, чтобы он наследовался?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2012, 17:34     Наследование преинкремента в класс с постинкрементом
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Псевдослучайный
1747 / 1090 / 71
Регистрация: 13.09.2011
Сообщений: 3,121
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
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
23.01.2012, 19:36     Наследование преинкремента в класс с постинкрементом #10
Цитата Сообщение от retmas Посмотреть сообщение
нет тут чудес.
Согласен. Проверил с простыми функциями, то же самое.
Цитата Сообщение от retmas Посмотреть сообщение
сокрытие
хз что.
Цитата Сообщение от retmas Посмотреть сообщение
ф-ии находятся в разных областях видимости, поэтому - сокрытие, а не перегрузка
По идее функция наследуется, потом перегружается. А здесь как тогда? Есть мысли? Может ссылки со справкой?

Цитата Сообщение от retmas Посмотреть сообщение
используйте using
retmas, спасибо.
silent_1991
Эксперт С++
4960 / 3036 / 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++
Указатель на тип базового класса при открытом наследовании может хранить адрес объекта производного класса. class num { ...

Абстрактный базовый класс и множественное наследование - C++
Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием. Помогите разобраться почему не работает,...

Виртуальное наследование (указатель на базовый класс) - C++
У меня ромбическая иерархия классов, при попытке вызвать метод производного класса ошибка, что я не так делаю? Вот исходный код ...


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

Или воспользуйтесь поиском по форуму:
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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