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


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

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

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/
Код: (CPP) [Выделить]
#include <iostream>
#include <cstdlib>

class Counter
{
protected:
    int count;
public:
    Counter() : count(0) {}
    Counter(int c) : count(c) {}
    Counter(const Counter &orig) : count(orig.count) {}

    Counter& operator ++() {
        ++count;
        return *this;
    }
    Counter operator ++(int) {
        Counter res(*this);
        ++count;
        return res;
    }
   
    friend std::ostream &operator <<(std::ostream &oss, const Counter &cnt);
};

class CountDn : public Counter
{
public:
    CountDn() : Counter() {}
    CountDn(int c) : Counter(c) {}
    CountDn(const CountDn &orig) : Counter(orig) {}

    CountDn& operator --() {
        --count;
        return *this;
    }
    CountDn operator --(int) {
        CountDn res(*this);
        --count;
        return res;
    }
    friend std::ostream &operator <<(std::ostream &oss, const CountDn &cnt);
};

std::ostream &operator <<(std::ostream &oss, const Counter &cnt)
{
    oss << cnt.count;
    return oss;
}

std::ostream &operator <<(std::ostream &oss, const CountDn &cnt)
{
    oss << cnt.count;
    return oss;
}

int main(int argc, char** argv)
{
    CountDn c(30);
    std::cout << c-- << std::endl;
    std::cout << c   << std::endl;
    std::cout << --c << std::endl;
    std::cout << ++c << std::endl;
    std::cout << c++ << std::endl;
    std::cout << c   << std::endl;
    return 0;
}

 

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