Отчёт
по лабораторной работе №3
по ООП
Проверил: Митителу В.
Кишинёв 2019
Тема: Перегрузка операторов
Цели работы:
изучение необходимости перегрузки операторов;
изучение синтаксиса определения операторов;
изучение типов операторов;
изучение форм перегрузки;
Задание :
а) Создать класс 2-D координат. Определить операторы "+" и "-" как дружественные
функции, а операторы присваивания и сравнения как методы класса. Должны быть
возможность осуществления операций, как между координатами, так и между координатами
и обычными числами.
b) Создать класс Stack – стек, используя динамическую память. Определить операторы "+" –
сложения стеков, "=" – присваивания, "()" – выдачи нового стека содержащего последние n
элементов - как методы класса. Определить операторы сравнения "==", "!=", "<", ">", как
дружественные функции. Для реализации последних двух операторов определить функцию,
вычисляющую норму элементов стека. Определить операторы ввода/вывода в поток. Класс
должен быть полностью функционален, то есть содержать все необходимые конструкторы и
деструктор.
Исходный код :
//Пункт А
#include <iostream>
class Dcoord
{
int x,y;
public:
Dcoord()
{
x=y=0;
}
Dcoord(int x, int y)
{
this->x=x;
this->y=y;
}
Dcoord(const Dcoord &t)
{
this->x=t.x;
this->y=t.y;
}
void assign(int mx, int my)
{
x=mx;
y=my;
}
Dcoord & operator = (const Dcoord &t)
{
this->x=t.x;
this->y=t.y;
return *this;
}
/*Dcoord & operator = (const Dcoord &&t)
{
this->x=t.x;
this->y=t.y;
return *this;
}*/
Dcoord friend operator +(const Dcoord t1, const Dcoord t2)
{
Dcoord temp;
temp.x= t1.x + t2.x;
temp.y= t1.y + t2.y;
return temp;
}
Dcoord friend operator +(const Dcoord t1, const int d)
{
Dcoord temp;
temp.x= t1.x + d;
temp.y= t1.y + d;
return temp;
}
Dcoord friend operator -(const Dcoord t1, const Dcoord t2)
{
Dcoord temp;
temp.x= t1.x - t2.x;
temp.y= t1.y - t2.y;
return temp;
}
Dcoord friend operator -(const Dcoord t1, const int d)
{
Dcoord temp;
temp.x= t1.x - d;
temp.y= t1.y - d;
return temp;
}
friend ostream & operator <<(ostream & out, const Dcoord & t)
{
out<<"("<<t.x<<","<<t.y<<")";
return out;
}
friend istream & operator >>(istream & in, Dcoord & t)
{
in>>t.x>>t.y;
return in;
}
bool operator ==(const Dcoord &t)
{
return ((this->x==t.x) && this->y==t.y);
}
bool operator !=(const Dcoord &t)
{
return !((this->x==t.x) && this->y==t.y);
}
bool operator >(const Dcoord &t)
{
return !((this->x<=t.x) || ((this->x==t.x) && (this->y<=t.y)));
}
bool operator >=(const Dcoord &t)
{
return !((this->x<t.x) || ((this->x==t.x) && (this->y<t.y)));
}
bool operator <(const Dcoord &t)
{
return ((this->x<=t.x) || ((this->x==t.x) && (this->y<=t.y)));
}
bool operator <=(const Dcoord &t)
{
return ((this->x<t.x) || ((this->x==t.x) && (this->y<t.y)));
}
};
int main()
{
Dcoord a,b,c;
bool result;
a.assign(34,2);
b.assign(4,32);
cout<<a<<endl;
cout<<b<<endl;
c=a-b-1;
cout<<c<<endl;
result =a == b;
cout<<"> "<<result;
return 0;
}
//Пункт Б
#include <iostream>
~Stack() {
for(int i=0; i<N; i++) {
delete s[i];
s[i] = nullptr;
}
delete [] s;
s = nullptr;
N = 0;
pointer = 0;
}
int size() {
return pointer;
}
int volume() {
return N;
}
void setArray(int p, const AnyType *a) {
for(int i=0; i<p; i++) {
if(s[i] != nullptr)
return;
s[i] = new AnyType;
*s[i] = a[i];
}
pointer = p;
}
void push(const AnyType &c) {
if(pointer == N) {
cout << "Error. Stack is full" << endl;
return;
}
s[pointer] = new AnyType;
*s[pointer++] = c;
}
Stack operator()(int p) {
if(p > pointer) {
cout << "Warning. Wrong stack volume" << endl;
return *this;
}
Stack a(N);
for(int i=pointer-p; i<pointer; i++) {
a.push(*s[i]);
}
return a;
}
Stack operator+(const Stack &a) {
Stack b(N + a.N);
for(int p=0; p<pointer; p++) {
b.push(*s[p]);
}
for(int p=0; p<a.pointer; p++) {
b.push(*a.s[p]);
}
return b;
}
AnyType& operator[](const int i) {
if(i<0 || i>=pointer)
throw 0;
return *s[i];
}
void pop() {
delete s[pointer-1];
s[pointer-1] = nullptr;
pointer--;
}
AnyType top() {
return *s[pointer-1];
}
Stack& operator=(const Stack &a) {
if(this == &a)
return *this;
this->~Stack<AnyType>();
new(this) Stack(a.N);
for(int i=0; i<a.pointer; i++)
push(*a.s[i]);
return *this;
}
friend bool operator==(const Stack &a, const Stack &b) {
return a.pointer == b.pointer;
}
friend bool operator!=(const Stack &a, const Stack &b) {
return a.pointer != b.pointer;
}
friend bool operator>(const Stack &a, const Stack &b) {
return a.pointer > b.pointer;
}
friend bool operator<(const Stack &a, const Stack &b) {
return a.pointer < b.pointer;
}
friend std::ostream& operator<<(std::ostream &out, const Stack &k) {
for(int i=0; i<k.pointer; i++) {
out << *k.s[i] << ' ';
}
return out;
}
friend std::istream& operator>>(std::istream &in, Stack &k) {
if(k.pointer == k.N) {
cout << "Error. Stack is full" << endl;
return in;
}
k.s[k.pointer] = new AnyType;
in >> *k.s[k.pointer++];
return in;
}
};
int main()
{
const int N = 3;
float a_array[N] = {1, 2, 3};
Stack<float> a(10, N, a_array);
cout << "Stack<float> a(10, N, a_array); . c: ";
for(int i=0; i<a.size(); i++) {
cout << a[i] << ' ';
}
cout << endl;
a.push(4); a.push(90);
cout << "a.push(4); a.push(90); . . . . . . a: " << a << endl;
a.pop();
cout << "a.pop(); . . . . . . . . . . . . . a: " << a << endl;
a.top();
cout << ". . . . . . . . . . . . . . a.top(): " << a << endl;
Stack<float> b(N);
b = a;
cout << "Stack<float> b(N); b = a; . . . . b: " << b << endl;
Stack<float> c = b;
Stack<float> p = a+b;
cout << "Stack<float> p = a+b; . . . . . . p: " << p << endl;
cout << "Stack<float> c = b; . . . . . . . b: " << b << endl;
Stack<float> d = a(2);
cout << "Stack<float> d = a(2); . . . . . . d: " << d << endl;
Stack<char> k;
for(int i=0; i<10; i++) {
cin >> k;
}
cout << "Stack<char> k; cin >> k; . . . . . k: " << k << endl;
return 0;
}
Полученные результаты :
Пункт А
Пункт Б