Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Маленькая проблема с наследованием в С++ и постфиксными и префиксныи операциями  (Прочитано 412 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
// counten2.cpp
// constructors in derived class
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Counter
   {
   public:                            //NOTE: not private
      unsigned int count;                //count
   public:
      Counter() : count(0)               //constructor, no args
         {  }
      Counter(int c) : count(c)          //constructor, one arg
         {  }
      unsigned int get_count() const     //return count
         { return count; }
      Counter operator ++ ()             //incr count (prefix)
         { return Counter(++count); }
      //  Counter operator ++ (int)             //incr count (prefix)
      //  { return Counter(count++); }
   };
////////////////////////////////////////////////////////////////
class CountDn : public Counter
   {
   public:
      CountDn() : Counter()              //constructor, no args
         { }
      CountDn(int c) : Counter(c)        //constructor, 1 arg
         { }
      CountDn operator -- ()             //decr count (prefix)
         { return CountDn(--count); }
          CountDn operator -- (int)             //decr count (prefix)
         { return CountDn(count--); }
         CountDn operator ++ ()             //decr count (prefix)
         { return CountDn(count++); }
   };
   
////////////////////////////////////////////////////////////////
int main()
   {
   CountDn c1;                           //class CountDn
   CountDn c2(30);
   cout<<(c2--).count<<endl;
    cout<<(c2).count<<endl;
   cout<<(--c2).count<<endl;
   cout<<(++c2).count<<endl;
   cout<<(c2++).count<<endl;
   cout<<(c2).count<<endl;
    return 0;
   }

Код выдает ошибку untitled.cxx:47:13: error: no ‘operator++(int)’ declared for postfix ‘++’.
Если переписать таким образом проблема исчезает.
class Counter
   {
   public:                            //NOTE: not private
      unsigned int count;                //count
   public:
      Counter() : count(0)               //constructor, no args
         {  }
      Counter(int c) : count(c)          //constructor, one arg
         {  }
      unsigned int get_count() const     //return count
         { return count; }
      Counter operator ++ ()             //incr count (prefix)
         { return Counter(++count); }
       Counter operator ++ (int)             //incr count (prefix)
        { return Counter(count++); }
   };
////////////////////////////////////////////////////////////////
class CountDn : public Counter
   {
   public:
      CountDn() : Counter()              //constructor, no args
         { }
      CountDn(int c) : Counter(c)        //constructor, 1 arg
         { }
      CountDn operator -- ()             //decr count (prefix)
         { return CountDn(--count); }
          CountDn operator -- (int)             //decr count (prefix)
         { return CountDn(count--); }
       //  CountDn operator ++ ()             //decr count (prefix)
        // { return CountDn(count++); }
   };
Как реализовать постфиксную операцию ++ в дочернем классе, если префиксная операция реализована в базовом классе?

Оффлайн Señor_Gaga

  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Хотел вам ответить. Но книжку по С++ потерял.
Последние 5 лет пишу на сишарпе.
Это ужас:
 public:
      CountDn() : Counter()              //constructor, no args
         { }
      CountDn(int c) : Counter(c)        //constructor, 1 arg
         { }
      CountDn operator -- ()

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Хотел вам ответить. Но книжку по С++ потерял.
Последние 5 лет пишу на сишарпе.
Это ужас:
 public:
      CountDn() : Counter()              //constructor, no args
         { }
      CountDn(int c) : Counter(c)        //constructor, 1 arg
         { }
      CountDn operator -- ()

Ну извини. Так в книге Лафоре написано. Да и не суть как что тут.  Главное проблему решить.

Оффлайн Scot_Tenorman

  • Автор темы
  • Любитель
  • *
  • Сообщений: 74
    • Просмотр профиля
Вопрос в том никак я пишу, а почему если я перегрузил постфиксную операцию в базовом классе, префиксную в дочернем я не могу использовать эти операции с объектом дочернего класса?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
http://habrahabr.ru/blogs/cpp/123417/
Код: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. class Counter
  5. {
  6. protected:
  7.     int count;
  8. public:
  9.     Counter() : count(0) {}
  10.     Counter(int c) : count(c) {}
  11.     Counter(const Counter &orig) : count(orig.count) {}
  12.  
  13.     Counter& operator ++() {
  14.         ++count;
  15.         return *this;
  16.     }
  17.     Counter operator ++(int) {
  18.         Counter res(*this);
  19.         ++count;
  20.         return res;
  21.     }
  22.    
  23.     friend std::ostream &operator <<(std::ostream &oss, const Counter &cnt);
  24. };
  25.  
  26. class CountDn : public Counter
  27. {
  28. public:
  29.     CountDn() : Counter() {}
  30.     CountDn(int c) : Counter(c) {}
  31.     CountDn(const CountDn &orig) : Counter(orig) {}
  32.  
  33.     CountDn& operator --() {
  34.         --count;
  35.         return *this;
  36.     }
  37.     CountDn operator --(int) {
  38.         CountDn res(*this);
  39.         --count;
  40.         return res;
  41.     }
  42.     friend std::ostream &operator <<(std::ostream &oss, const CountDn &cnt);
  43. };
  44.  
  45. std::ostream &operator <<(std::ostream &oss, const Counter &cnt)
  46. {
  47.     oss << cnt.count;
  48.     return oss;
  49. }
  50.  
  51. std::ostream &operator <<(std::ostream &oss, const CountDn &cnt)
  52. {
  53.     oss << cnt.count;
  54.     return oss;
  55. }
  56.  
  57. int main(int argc, char** argv)
  58. {
  59.     CountDn c(30);
  60.     std::cout << c-- << std::endl;
  61.     std::cout << c   << std::endl;
  62.     std::cout << --c << std::endl;
  63.     std::cout << ++c << std::endl;
  64.     std::cout << c++ << std::endl;
  65.     std::cout << c   << std::endl;
  66.     return 0;
  67. }
  68.  

 

Страница сгенерирована за 0.064 секунд. Запросов: 24.