Официальный сайт студ.городка НГТУ
Программирование и БД » определение инкремента 

#1  29.11.07 20:06

определение инкремента

Приветствую всех!
Наткнулся я на проблему переопределения префиксного и постфиксного инкремента\декримента для мною созданного класса.
В "страуструпе" пишется, н-р:

Код C++
class MyClass
{
   private:
        .
        .
        .
   public:
        .
        .
        .
        MyClass operator ++();  //префиксный
        MyClass operator ++(int ); // постфиксный  ... параметр int указывает на то, что ++ будет вызываться постфиксно
}



после этого я определил префиксный и постфиксный инкременты, и в результате их тестирования, оказалось, что оба они выполняются, как постфиксные.
Видимо я самой сути не понял....
Ну а теперь, собственно, просьба:
чтоб я все наглядно понял, напишите пожалуйста один класс, и пусть в нем будет, допустим, один член класса (интовый), и будут в нем определены префиксные и постфиксные инкременты.

буду очень признателен вам!)

Offline

#2  29.11.07 21:27

Re: определение инкремента

Код: cpp:

class CInteger{
int val;
 
public:
CInteger(int n){val = n;}
 
CInteger operator - (CInteger &a, CInteger &b){return *new CInteger(a.val * b.val);}
}
}


Тебя это не на какие мысли не наводит?

Offline

#3  29.11.07 22:55

Re: определение инкремента

voropay, в этом... как его... в Подбельском ну ооочень нормально описано перегрузка инкрементов/декрементов... если делать все точно как написано - все замечательно.

P.S. хотя мне кажется, что именно его автор до этого и курил :)

Offline

#4  30.11.07 11:41

Re: определение инкремента

Код: cpp:

#include <iostream.h>
 
class MyClass
{
   private:
        int val;
   public:
        // Конструктор
        MyClass(int n) {
            val = n;
        }
        // префиксный ++
        MyClass& operator ++() {
            val += 10; // для выявления различия будем увеличивать на 10 :)
            return *this;
        }
        // постфиксный ++
        MyClass& operator ++(int k) {
            val += 1;
            return *this;
        }
 
        void display() {
            cout << "Value: val = " << val << "\n";
        }
};
 
int main()
{
     MyClass n(10);
     n.display();
     n++;
     n.display();
     ++n;
     n.display();
     return(1);
}


Value: val = 10
Value: val = 11
Value: val = 21

Исправлено Jaguar (30.11.07 11:42)

Offline

#5  30.11.07 16:32

Re: определение инкремента

Код::

// префиксный ++
        MyClass& operator ++() {
            val += 10; // для выявления различия будем увеличивать на 10 :)
            return *this;
        }
        // постфиксный ++
        MyClass& operator ++(int k) {
            val += 1;
            return *this;
        }

это НЕ верно.
в постфиксной форме должно возвращаться _неизмененное_ число.
и постфиксная форма не должна возвращать ссылку на объект.  в противном случае существует некорректность.

Offline

#6  30.11.07 17:43

Re: определение инкремента

Andron_
1. это по примеру из Подбельского... ничего не придумывал
2. здесь не закладывается логика постфиксного и префиксного инкремента, а показывается факт того, что перегрузка операции происходит...

Offline

#7  30.11.07 18:50

Re: определение инкремента

Jaguar, а эта... чем тогда этот кусок кода поможет автору?

P.S. в Подбельском нет. специально пересмотрел... где то в дргуом месте видел.

Offline

#8  03.12.07 10:24

Re: определение инкремента

Andron_ написал(а):

P.S. в Подбельском нет

Подбельский В.В. Язык Си++. 5-е издание. Страница 334. Параграф 9.7. Описание класса pair.

Andron_ написал(а):

чем тогда этот кусок кода поможет автору?

voropay написал(а):

напишите пожалуйста один класс, и пусть в нем будет, допустим, один член класса (интовый), и будут в нем определены префиксные и постфиксные инкременты.

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

Код: cpp:

 
#include <iostream.h>
 
class MyClass
{
   protected:
        int val;
        bool postinc;
   public:
        // Конструктор
        MyClass() { val = 0; postinc = false; }
        MyClass(int n) {
            val = n;
            postinc = false;
        }
        MyClass operator +(MyClass &k) {
            MyClass d;
            d.val = this->val + k.val;
            return d;
        }
        // префиксный ++
        MyClass& operator ++() {
            //val += 10; // для выявления различия будем увеличивать на 10 :)
            ++val;
            return *this;
        }
        // постфиксный ++
        MyClass& operator ++(int k) {
            //val += 1;
            postinc = true;
            return *this;
        }
 
        void display() {
            cout << "Value: val = " << val << "\n";
        }
        int getVal() {
            if(postinc) {
                postinc = false;
                return val++;
            }
            return val;
        }
};
 
int main()
{
     MyClass n(10);
     cout << "Заданное значение n = " << n.getVal() << "\n";
     n++;
     cout << "Постфиксный инкремент n = " << n.getVal() << "\n";
     ++n;
     cout << "Префиксный инкремент n = " << n.getVal() << "\n";
     return(1);
}


Заданное значение n = 10
Постфиксный инкремент n = 10
Префиксный инкремент n = 12

Исправлено Jaguar (03.12.07 10:26)

Offline

#9  03.12.07 22:58

Re: определение инкремента

Jaguar написал(а):

Подбельский В.В. Язык Си++. 5-е издание.

не читал, но странно видеть ляпы в 5-м издании
1) что будет, если постфиксный инкремент вызвать 2 раза подряд?
2) return val++; -- вернет текущее значение

Offline

#10  04.12.07 00:21

Re: определение инкремента

Ок, всем спасибо кто как-то проявлял себя в дискуссии....
Проблему решил, только в работу постфиксного инкремента так и не въехал, наверно рано еще, наверно время еще не пришло..!

Offline

#11  04.12.07 09:18

Re: определение инкремента

Matrim написал(а):

1) что будет, если постфиксный инкремент вызвать 2 раза подряд?

Серега, я же говорю, что тут надо уже алгоритм постфиксного инкремента сидеть и продумывать... ессно, мой пример, всего лишь частный случай и на универсальность не тянет...

Offline

#12  05.12.07 00:15

Re: определение инкремента

как уже промелькнуло где-то выше - в случае постфиксного инкремента нужно вернуть копию объекта

Offline

Программирование и БД » определение инкремента 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.094 сек.
Выполнено 14 запросов.