#1 29.11.07 20:06
определение инкремента
Приветствую всех!
Наткнулся я на проблему переопределения префиксного и постфиксного инкремента\декримента для мною созданного класса.
В "страуструпе" пишется, н-р:
Код C++
class MyClass
{
private:
.
.
.
public:
.
.
.
MyClass operator ++(); //префиксный
MyClass operator ++(int ); // постфиксный ... параметр int указывает на то, что ++ будет вызываться постфиксно
}
после этого я определил префиксный и постфиксный инкременты, и в результате их тестирования, оказалось, что оба они выполняются, как постфиксные.
Видимо я самой сути не понял....
Ну а теперь, собственно, просьба:
чтоб я все наглядно понял, напишите пожалуйста один класс, и пусть в нем будет, допустим, один член класса (интовый), и будут в нем определены префиксные и постфиксные инкременты.
буду очень признателен вам!)
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
#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
#10 04.12.07 00:21
#11 04.12.07 09:18
Re: определение инкремента
Matrim написал(а):
1) что будет, если постфиксный инкремент вызвать 2 раза подряд?
Серега, я же говорю, что тут надо уже алгоритм постфиксного инкремента сидеть и продумывать... ессно, мой пример, всего лишь частный случай и на универсальность не тянет...
Offline

