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

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

Восстановить пароль Регистрация
 
larev02
Сообщений: n/a
27.03.2010, 13:19     Непонятки с наследованием #1
Будьте добры, проясните пожалуйста такой момент:
Есть код:
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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2010, 13:19     Непонятки с наследованием
Посмотрите здесь:

C++ Проблемы с наследованием
C++ Проблема с наследованием
Массив классов с наследованием C++
C++ Проблемы с наследованием
C++ Проблемы с наследованием классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
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;
 
 }
larev02
Сообщений: n/a
27.03.2010, 14:51     Непонятки с наследованием #3
Цитата Сообщение от Genius Ignat Посмотреть сообщение
По твоему примеру получается префиксальная своя а постфиксная от другого как то некрасиво.
По другому нельзя. Задание четкое: есть 2 класса Counter и CountDn, надо создать производный класс в котором будет перегружена постфиксная операция инкремента и декремента (имеющиеся 2 класса изменять нельзя). Вот и ломаю голову сижу что да как
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
27.03.2010, 15:39     Непонятки с наследованием #4
Мои компилятор не воспринимает подобного поэтому извини больше ни чем помочь не могу.

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

Не по теме:


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

Yandex
Объявления
27.03.2010, 15:39     Непонятки с наследованием
Ответ Создать тему
Опции темы

Текущее время: 08:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru