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

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

Войти
Регистрация
Восстановить пароль
 
Onito
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 20
#1

Перегрузка оператора при наследовании - C++

25.11.2013, 13:03. Просмотров 405. Ответов 7
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста, как избежать следующей ошибки без явного определения в производном классе перегрузки оператора:

Ошибка:
main.cpp:45: error: no match for 'operator++' (operand type is 'CountPost')
main.cpp:45: candidate is:
main.cpp:34: Count CountPost::operator++(int)
main.cpp:34: note: candidate expects 1 argument, 0 provided

По сути компилятор пытается использовать постфиксный вариант игнорируя наследованный префиксный.

Листинг программы:
#include <iostream>

using namespace std;

class Count
{
protected:
unsigned int count;
public:
Count() : count(0)
{ }
Count(int c) : count(c)
{ }
int put()const
{
return count;
}
Count operator++()
{ return Count(++count); }
operator int()
{ return count; }
};

class CountDn : public Count
{
public:
Count operator--()
{ return Count(--count); }
};

class CountPost : public CountDn
{
public:
Count operator++(int )
{ return Count(count++);}
Count operator--(int )
{return Count(count--);}
};

int main()
{
CountDn b;
cout << ++b << endl;
CountPost a;
cout << ++a << endl;
cout << a++ << endl;
cout << a-- << endl;
cout << a << endl;
cout << a.put();
}
в строке cout << ++b << endl; всё впорядке
а эта строка cout << ++a << endl; вызывает указанную выше ошибку
ОС: Ubuntu 13.10, Qt.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2013, 13:03     Перегрузка оператора при наследовании
Посмотрите здесь:

Перегрузка операторов при наследовании - C++
Есть базовый(StringType) и производный(tcomplex) классы. Соотвественно это строка и комплексное число. По заданию необходимо было создать...

Перегрузка ввода и вывода при наследовании - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;string&gt; using namespace std; class Base { int b; public: friend istream&amp;...

Перегрузка оператора - C++
Здравствуйте. Нужна помощь) Есть такой класс: class vect { public: float *items; vect() { items = new float; for(int...

Перегрузка оператора * - C++
Здрасте. Есть задача: Реализовать класс Matrix размерностью NxN, в которой хранятся числа типа float. Память под элементы выделять...

перегрузка оператора [] - C++
объясните в 3х словах для ламера в чем смысл перегрузки, конкретно оператора

Перегрузка оператора + и = - C++
Здравствуйте! Возникла проблема при реализации кода перегрузки операторов. BigInt - это просто класс характеризующий огромные числа в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
25.11.2013, 13:10     Перегрузка оператора при наследовании #2
Или определить приведение или кастовать к типу у которого есть приведение иначе никак.
Onito
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 20
25.11.2013, 13:20  [ТС]     Перегрузка оператора при наследовании #3
Объясните подробнее к чему приведение, я не очень понял Вашу идею
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
25.11.2013, 13:23     Перегрузка оператора при наследовании #4
К тому типу у которого есть нужный operator.
Onito
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 20
25.11.2013, 13:33  [ТС]     Перегрузка оператора при наследовании #5
Я имел ввиду что не понял в этой фразе:"Или определить приведение или кастовать к типу у которого есть приведение иначе никак" слово приведение, вы предлагаете преобразовать в данной ситуации переменную типа CountPost к какому либо типу у которого определена префиксная форма?
stima
457 / 306 / 24
Регистрация: 22.03.2011
Сообщений: 996
Завершенные тесты: 2
25.11.2013, 14:12     Перегрузка оператора при наследовании #6
Да.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.11.2013, 14:47     Перегрузка оператора при наследовании #7
Цитата Сообщение от stima Посмотреть сообщение
К тому типу у которого есть нужный operator.
Можно сделать friend оператор в базовом классе (принимающий ссылку) и тогда экземпляр дочернего класса приводить к базовому не надо. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class CountDn : public Count
{
public:
Count operator--()
{ return Count(--count); }
friend Count operator++(CountDn&);
};
 
Count operator++(CountDn& cd)
{ 
    return Count(++cd.count); 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 14:59     Перегрузка оператора при наследовании
Еще ссылки по теме:

Перегрузка оператора [] - C++
Что не правильно я перегрузил? #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; struct S_List { char c; S_List...

Перегрузка оператора - C++
Привет, форумчане. Есть простой класс, в котором перегружается оператор '==' : #ifndef POINT_H #define POINT_H class point{ ...

Перегрузка оператора new[] - C++
Привет всем, программирую давольно давно, на с++ второй год. Столкнулся с задачей, в которой нужно создать свой класс и корректно в нем...

Перегрузка оператора () - C++
Привет всем помогите придумать способ реализаци следущей задачи: есть класс симметричная матрица: class Matrix { ...


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

Или воспользуйтесь поиском по форуму:
Onito
0 / 0 / 0
Регистрация: 25.11.2013
Сообщений: 20
25.11.2013, 14:59  [ТС]     Перегрузка оператора при наследовании #8
Да это сработало, спасибо
Yandex
Объявления
25.11.2013, 14:59     Перегрузка оператора при наследовании
Ответ Создать тему
Опции темы

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