#include <iostream>
#include <sstream>
#include <windows.h>
using namespace std;
class MyInt {
private:
int value;
public:
// конструктор с параметром по умолчанию
MyInt( const int val = 0 ) : value( val ) {
}
// конструктор копирования
MyInt( const MyInt& copy ) : value( copy.value ) {
}
int GetValue() const {
return value;
}
void SetValue( const int val ) {
value = val;
}
MyInt& operator=( const MyInt& copy );
// префиксный декремент
MyInt& operator--();
// постфиксный декремент
MyInt operator--( int ); // параметр int для отличия от префиксной формы
MyInt operator+( const MyInt& other );
MyInt operator-( const MyInt& other );
MyInt operator*( const MyInt& other );
MyInt operator/( const MyInt& other );
MyInt& operator+=( const MyInt& other );
MyInt& operator-=( const MyInt& other );
MyInt& operator*=( const MyInt& other );
MyInt& operator/=( const MyInt& other );
// объявляем дружественные функции требуемые в классе
// префиксный инкремент
friend MyInt& operator++( MyInt& my );
//постфиксный инкремент
friend MyInt operator++( MyInt& my, int );
friend bool operator<(const MyInt& left, const MyInt& right );
friend bool operator>(const MyInt& left, const MyInt& right );
friend bool operator!=(const MyInt& left, const MyInt& right );
friend bool operator==(const MyInt& left, const MyInt& right );
};
ostream& operator<<(ostream& os, const MyInt& my) {
os << my.GetValue(); // friend my.value
return os;
}
istream& operator>>(istream& is, MyInt& my) {
int val;
is >> val;
my.SetValue( val );
return is;
}
MyInt& MyInt::operator=( const MyInt& copy ) {
value = copy.value;
return *this;
}
MyInt& MyInt::operator--() {
--value; // отнимаем 1
return *this; // потом возвращаем объект в актуальном состоянии
}
MyInt MyInt::operator--( int ) {
MyInt pre = *this; // делаем копию текущего объекта
operator--(); // применяем префиксный декремент к текущему объекту
return pre; // возвращаем копию объекта, в которой содержится поле в предыдущем состоянии
}
MyInt& operator++( MyInt& my ) {
++my.value;
return my;
}
MyInt operator++( MyInt& my, int) {
MyInt pre = my;
++my.value;
return pre;
}
bool operator<( const MyInt& left, const MyInt& right ) {
return left.value < right.value;
}
bool operator>( const MyInt& left, const MyInt& right ) {
return left.value > right.value;
}
bool operator!=( const MyInt& left, const MyInt& right ) {
return left.value != right.value;
}
bool operator==( const MyInt& left, const MyInt& right ) {
return left.value == right.value;
}
MyInt MyInt::operator+( const MyInt& other ) {
return MyInt( value + other.value );
}
MyInt MyInt::operator-( const MyInt& other ) {
return MyInt( value - other.value );
}
MyInt MyInt::operator*( const MyInt& other ) {
return MyInt( value * other.value );
}
MyInt MyInt::operator/( const MyInt& other ) {
return MyInt( value / other.value );
}
MyInt& MyInt::operator+=( const MyInt& other ) {
value += other.value;
return *this;
}
MyInt& MyInt::operator-=( const MyInt& other ) {
value -= other.value;
return *this;
}
MyInt& MyInt::operator*=( const MyInt& other ) {
value *= other.value;
return *this;
}
MyInt& MyInt::operator/=( const MyInt& other ) {
value /= other.value;
return *this;
}
int GetNumber( const string &mes, const int low, const int high ) {
string nStr;
long long n;
while ( true ) {
cout << mes << " от " << low << " до " << high << ": ";
getline( cin, nStr ); // считываем строку неограниченной длины, до нажатия Enter
int sign = 1;
if ( nStr[0] == '-' ) { // проверяем наличие знака минус перед цифрами
sign = -1; // если знак минус есть, то запоминаем знак числа
// удалить знак минус перед числом
nStr.erase( 0, 1 );
}
// пробуем найти ЛЮБОЙ символ, НЕ входящий в набор 0123456789
if ( nStr.find_first_not_of( "0123456789" ) == string::npos ) { // если НЕ нашли, то введено целое число
stringstream ss;
ss << nStr; // отдаём строковому потоку строку, которая представляет собой запись целого полоительного числа
ss >> n; // просим строковый поток вернуть нам int значение
n *= sign;
if ( n >= low && n <= high )
break;
}
cout << "Ошибка ввода! Значение должно быть " << "от " << low << " до " << high << "!" << endl;
}
return n;
}
int main() {
SetConsoleCP( 1251 );
SetConsoleOutputCP( 1251 );
bool flagExit = false;
while ( !flagExit ) {
int a = GetNumber( "Введите целое число A", -100000, 100000 );
int b = GetNumber( "Введите целое число B", -100000, 100000 );
MyInt objA( a ), objB( b );
cout << "Выберите пункт меню:\n";
cout << "1 - сумма\n";
cout << "2 - разность\n";
cout << "3 - произведение\n";
cout << "4 - целочисленное деление\n";
cout << "5 - сравнение\n";
cout << "6 - инкремент\n";
cout << "7 - декремент\n";
cout << "0 - выход\n";
int opt = GetNumber( "Введите число", 0, 7 );
switch( opt ) {
case 1: {
cout << "A + B = " << objA + objB << endl;
break;
}
case 2: {
cout << "A - B = " << objA - objB << endl;
break;
}
case 3: {
cout << "A * B = " << objA * objB << endl;
break;
}
case 4: {
cout << "A / B = " << objA / objB << endl;
break;
}
case 5: {
if ( objA > objB )
cout << "A > B" << endl;
else if (objA < objB )
cout << "A < B" << endl;
else
cout << "A = B" << endl;
break;
}
case 6: {
cout << "++A = " << ++objA << endl;
cout << "B++ = " << objB++ << endl;
cout << "B = " << objB << endl;
break;
}
case 7: {
cout << "--A = " << --objA << endl;
cout << "B-- = " << objB-- << endl;
cout << "B = " << objB << endl;
break;
}
case 0: {
flagExit = true;
break;
}
}
}
return 0;
}