Я пишу простой класс Int и использую перегрузку оператора, чтобы позволить объектам вести себя так же, как и «int». Я сломал всю мою программу в 3-х файлов, 1) Заголовок файла: содержит объявление класса 2) Определение всех перегружена функций 3) Тестовый файл, содержащий основной Эти три упомянуты здесь в том же порядкеПерегрузка оператора для класса типа Int
#include <iostream>
using namespace std;
class Int
{
private:
int i;
public:
Int(): i(0) { }
Int(int in) : i(in) { }
void show() const
{
cout<<"value: "<<i<<endl;
}
Int operator +(const Int&) const;
Int operator -(const Int&) const;
Int operator *(const Int&) const;
Int operator /(const Int&) const;
//Int add(const Int&) const;
};
Функция определение
#include <iostream>
#include <climits>
#include <cassert>
#include "int.h"
using namespace std;
typedef unsigned long long ull;
Int Int::operator +(const Int &i1) const
{
ull result;
result = i+ i1.i;
//cout<< result<<'\n';
if (result>INT_MAX)
{
cout<<"Out of int range.\n";
//assert(0);
}
else
return Int(int(result));
}
Int Int::operator -(const Int &i1) const
{
//typedef unsigned long long ull;
ull result;
result = i - i1.i;
//cout<< result<<'\n';
if (result < INT_MIN)
{
cout<<"Out of int range.\n";
//assert(0);
}
else
return Int(int(result));
}
Int Int::operator *(const Int &i1) const
{
//typedef unsigned long long ull;
ull result;
result = i* i1.i;
//cout<< result<<'\n';
if (result >INT_MAX)
{
cout<<"Out of int range.\n";
//assert(0);
}
else
return Int(int(result));
}
Int Int::operator /(const Int &i1) const
{
//typedef unsigned long long ull;
ull result;
result = i/ i1.i;
//cout<< result<<'\n';
if (result < INT_MIN)
{
cout<<"Out of int range.\n";
//assert(0);
}
else
return Int(int(result));
}
и тестовая программа с основной:
#include <iostream>
#include "int.h"
int main(int argc, char const *argv[])
{
Int i1;
Int i2(4);Int i3(2);
i1 = i2 + i3;
i1.show();
i1 = i2 - i3;
i1.show();
i1 = i2 * i3;
i1.show();
i1 = i2/i3;
i1.show();
return 0;
}
Ожидаемый результат:
Value : 6,
Value : 2,
value : 8
Value : 2.
Однако я получаю такой вывод:
value: 6
Out of int range.
value: 6
value: 8
Out of int range.
value: 8
Я пробовал много, где я неправильно, но не смог найти. Любое руководство будет отличной помощью.
Кстати, если вы хотите, чтобы ваш класс был как можно больше «int», просто с некоторыми дополнительными методами, не начинайте делать + - и т. Д., Но создавайте (неявный) оператор литья для 'int '(в дополнение к вашему уже существующему конструктору для другого направления) – deviantfan
@ vik14dec С первого взгляда может показаться, что операторы-члены (' Int :: operator + (const Int &) ') проще реализовать, чем автономная версия (' friend Int operator + (const Int &, const Int &) ') - Я настоятельно рекомендую всегда предпочитать автономные версии, когда это возможно .... – PiotrNycz
Вы должны добавить бросок или возврат внутри этих' if' ветвей btw –