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

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

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

Author24 — интернет-сервис помощи студентам
Будьте добры, проясните пожалуйста такой момент:
Есть код:
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.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2010, 13:19
Ответы с готовыми решениями:

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

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

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

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

3
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
27.03.2010, 14:29 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
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 3
Цитата Сообщение от Genius Ignat Посмотреть сообщение
По твоему примеру получается префиксальная своя а постфиксная от другого как то некрасиво.
По другому нельзя. Задание четкое: есть 2 класса Counter и CountDn, надо создать производный класс в котором будет перегружена постфиксная операция инкремента и декремента (имеющиеся 2 класса изменять нельзя). Вот и ломаю голову сижу что да как
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
27.03.2010, 15:39 4
Мои компилятор не воспринимает подобного поэтому извини больше ни чем помочь не могу.

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

Не по теме:


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

0
27.03.2010, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2010, 15:39
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru