Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
larev02

Непонятки с наследованием

27.03.2010, 13:19. Показов 849. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Будьте добры, проясните пожалуйста такой момент:
Есть код:
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
62
#include <iostream>
using namespace std;
 
class Counter {
   protected:        
      unsigned int count;  
   public:
      Counter() : count(0)      
         {  }
      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); }
};
  
class postfix : public CountDn {
    public:
        postfix() : CountDn()
        {}
        postfix(int c) : CountDn(c)
        {}
        postfix operator ++(int)
        {
            return postfix(++count);
        }
        postfix operator --(int)
        {
            return postfix(--count);
        }
};
 
int main()
   {
   postfix c1;          
   postfix c2(100);
 
   cout << "\nc1=" << c1.get_count();  
   cout << "\nc2=" << c2.get_count();
 
   ++c1; ++c1; ++c1;                
   cout << "\nc1=" << c1.get_count();  
 
   --c2; --c2;                  
   cout << "\nc2=" << c2.get_count();  
 
   postfix c3 = --c2;  
   cout << "\nc3=" << c3.get_count();
   cout << endl;
   return 0;
   }
Компилятор выдает ошибку. Почему он не подставляет operation++ и operation-- от базового класса?

Если код немного переделать:
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
62
63
64
65
66
67
68
69
70
#include <iostream>
using namespace std;
 
class Counter {
   protected:        
      unsigned int count;  
   public:
      Counter() : count(0)      
         {  }
      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); }
};
  
class postfix : public CountDn {
    public:
        postfix() : CountDn()
        {}
        postfix(int c) : CountDn(c)
        {}
        postfix operator ++()
        {
            return CountDn::operator++();
        }
        postfix operator --()
        {
            return CountDn::operator--();
        }
        postfix operator ++(int)
        {
            return postfix(++count);
        }
        postfix operator --(int)
        {
            return postfix(--count);
        }
};
 
int main()
   {
   postfix c1;          
   postfix c2(100);
 
   cout << "\nc1=" << c1.get_count();  
   cout << "\nc2=" << c2.get_count();
 
   ++c1; ++c1; ++c1;                
   cout << "\nc1=" << c1.get_count();  
 
   --c2; --c2;                  
   cout << "\nc2=" << c2.get_count();  
 
   postfix c3 = --c2;  
   cout << "\nc3=" << c3.get_count();
   cout << endl;
   return 0;
   }
снова ошибка. На строках return CountDn::operator++(); и return CountDn::operator--(); пишет: conversion from `Counter' to non-scalar type `post' requested. Что ему от меня надо?

Компилятор MinGW.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2010, 13:19
Ответы с готовыми решениями:

Проблема с наследованием
Здравствуйте, уважаемые Все! Столкнулся со следующей проблемой. Необходимо реализовать паттерн программирования &quot;Фабричный...

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

Проблемы с наследованием
Выпадает такая ошибка Error 3 error C2259: 'Operator' : cannot instantiate abstract class d:\учёба\ооп\терминал...

3
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
27.03.2010, 14:29
Пример с комментированной ошибкой :
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
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
 
class Counter {
   protected:        
   int count;  
   public:
      Counter() : count(0)      
         {  }
      Counter(int c) : count(c)    
         {  }
      unsigned int get_count() const  
         { return count; }
      Counter& operator ++ (){ ++count; return * this ; }
 
      
 
 
};
 
class CountDn : public Counter {
 
   public:
      CountDn() : Counter()
         { }
      CountDn(int c) : Counter(c)  
         { }
      CountDn& operator -- ()    {  --count; return *this;   }
    
 
};
  
class postfix : public CountDn {
 
    public:
        postfix() : CountDn()
        {}
        postfix(int c) : CountDn(c)
        {}
/* Постфиксная накрывает префиксную базового, так компилятор считает, и поэтому ++dd; будет ошибкой 
так как префиксной нет
 накрывает : делает не доступной 
  */
            postfix  operator ++(int){
            postfix obj(*this); count++;
            return obj;
        }
 
/* Постфиксная накрывает префиксную базового, так компилятор считает, и поэтому --bb; будет ошибкой, 
так как префиксной нет
   накрывает : делает не доступной  
*/          
            postfix  operator --(int){
            postfix obj(*this); count--;
            return obj;
        }
 
        
};
 
int main()
   {
   postfix dd,bb(20);  
   dd++;
   bb--;
   ++dd; //ошибка
   --bb; //ошибка
  return 0;
 }
Вероятно компилятор разрешает наследовать парами ++ и ++(int) -- и --(int)
он не разрешает разбрасывается формами операций по иерархии,
тем более получается что базовые классы по твоему примеру обладают недостатками:
так как определена только одна префиксная форма ++ и -- у каждого
По твоему примеру получается префиксальная своя а постфиксная от другого как то некрасиво.

Вот мое предложение.
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
62
63
64
65
#include <iostream>
using namespace std;
 
class Counter {
   protected:        
   int count;  
   public:
      Counter() : count(0)      
         {  }
      Counter(int c) : count(c)    
         {  }
      unsigned int get_count() const  
         { return count; }
      Counter& operator ++ (){ ++count; return * this ; }
 
            Counter operator ++(int){
            Counter obj(*this); count++;
            return obj;
        }
 
 
};
 
class CountDn : public Counter {
 
   public:
      CountDn() : Counter()
         { }
      CountDn(int c) : Counter(c)  
         { }
      CountDn& operator -- ()    {  --count; return *this;   }
      
      CountDn operator --(int){
            CountDn obj(*this); count--;
            return obj;
        }
 
};
  
class postfix : public CountDn {
 
    public:
        postfix() : CountDn()
        {}
        postfix(int c) : CountDn(c)
        {}
 
        
};
 
int main()
   {
   postfix c1;          
   postfix c2(100);
   cout << "\nc1=" << c1.get_count();  
   cout << "\nc2=" << c2.get_count();
   ++c1; ++c1; ++c1;              
   c2++;c1++;
   cout << "\nc1=" << c1.get_count();  
   --c2; --c2;                  
   cout << "\nc2=" << c2.get_count();  
 
  return 0;
 
 }
0
larev02
27.03.2010, 14:51
Цитата Сообщение от Genius Ignat Посмотреть сообщение
По твоему примеру получается префиксальная своя а постфиксная от другого как то некрасиво.
По другому нельзя. Задание четкое: есть 2 класса Counter и CountDn, надо создать производный класс в котором будет перегружена постфиксная операция инкремента и декремента (имеющиеся 2 класса изменять нельзя). Вот и ломаю голову сижу что да как
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
27.03.2010, 15:39
Мои компилятор не воспринимает подобного поэтому извини больше ни чем помочь не могу.

Добавлено через 5 минут
По твоему примеру получается префиксальная своя а постфиксная от другого как то некрасиво.
Не так сказал:
По твоему примеру получается постфиксная своя а префиксальная от другого как то некрасиво.
Добавлено через 5 минут

Не по теме:


Порой задания без смысла играют большую роль в освоении программирования, не желе подобное.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2010, 15:39
Помогаю со студенческими работами здесь

Проблема с наследованием
Есть задание: Разработать три класса, которые следует связать между собой, используя наследование: 1. класс Product, который имеет три...

подскажите пожалуйста с наследованием
Здравствуйте! такой вопрос... создаю базовый класс к примеру : class Books от него наследую class History : public...

Проблемы с наследованием классов
1-е задание: Создать класс базовый класс «вещественное число». Элементы класса (поля имеют статус доступа protected): поле,...

Создать класс с наследованием с++
Добрый день, по условию : Для определения иерархии классов связать отношением наследования классы, приведенные ниже. Из перечисленных...

Класс со множественным наследованием
Доброе день! Необходимо оперативно написать программу, надеюсь на вашу помощь! Текст программы: Написать класс &quot;Автомобиль&quot; с...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru