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

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

Войти
Регистрация
Восстановить пароль
 
larev02
Сообщений: n/a
#1

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

27.03.2010, 13:19. Просмотров 410. Ответов 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.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2010, 13:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятки с наследованием (C++):

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

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

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

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

Задача с шаблонами и наследованием - C++
Ребята, есть такая проблема.. Предположим, что у нас есть класс Image (не шаблонный). И есть класс ImageExt&lt;T1,T2&gt; (шаблонный),...

Не могу разобраться с наследованием - C++
есть клас class Liquid{ private: string name; float density; public: Liquid(){ ...

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

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

Не по теме:


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

0
27.03.2010, 15:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2010, 15:39
Привет! Вот еще темы с ответами:

Не разберусь с наследованием класса - C++
Помогите разобраться с классами. Есть класс - шаблон и 2 класса наследуемые от него template &lt;class Type&gt; class VRTSmartStr : public...

Массив классов с наследованием - C++
Hi,all and thanks in advance. Shape base class, line and Point derived classes. What should I declare in .h files and implement in .cpp...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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