Форум программистов, компьютерный форум CyberForum.ru

Перегрузка операторов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Помогите с бинарным файлом http://www.cyberforum.ru/cpp-beginners/thread16406.html
Есть задачка звучит так: Вы являетесь владельцем склада металлических изделий и нуждаетесь в инвентаризации, которая сказала бы вам, сколько всего различных изделий вы имеете, какое количество каждого Жиз них у вас на руках и стоимость каждого из них. Напишите программу, которая бы создавала файл произвольного доступа «hardware.dat» на сотню пустых записей, позволяла бы вводить данные по каждому...
C++ Создание простенькой игры Кто нибудь раньше читал книги-игры? Ну там: если вы поварачиваете направо, то 326 параграф; если налево то 23. никто не подскажет на каком уровне можно написать такую программу что бы она сама переносила на нужные ссылки, записывала имеющиеся предметы, проигрывала сражения и т.д. http://www.cyberforum.ru/cpp-beginners/thread16332.html
C++ Впадаю в страшную рекурсию... еще вопрос по указателям
Почему в рекурсию? Начинаю разбирать код на С. и понимаю что я чего то не знаю. - начинаю разбираться как с этим работать, как понимаю что мне еще что то надо знать - вот так ухожу вдаль от изначальной проблемы :) Вопрос не нашел на просторах инета, нашел только что написал изначально не правильно, хотя работало ( хоть не так как надо ), а потом написал правильно, но тоже работало (хотя тоже...
Работа с указателями в объектах и без них, помогите разобраться C++
Значит так! Есть 4 указателя - 2 из них описанны в классе, 2 глобально. В классе есть конструктор, который выделяет место под переменную первого указателя. и присваивает адрес, на который ссылается первый указатель второму. Такая же действие производится с глобальными указателями в программе. При выводе областей памяти, на которые ссылаются указатели - у тех указателей которые прописывались...
C++ Составить программу для произвольного рисования на экране http://www.cyberforum.ru/cpp-beginners/thread16072.html
Составить программу для произвольного рисования на экране. Рисунок - это след курсора, перемещаемого с помощью клавишь управления курсором. Должна обеспечиваться возможность изменения цвета линий в процессе рисования.
C++ Определить произведение отрицательных элементов матрицы и их количество Заданы две матрицы А={aij} размерности n*n и B={bij} размерности n*g. Для каждой из них определить произведение отрицательных элементов и их количество. Упорядочить элементы строк в матрице А и столбцов матрицы В в порядке роста, линейной быстрой сортировкой. вот кое -что написала, а как дальше незнаю:sorry: #include <iostream.h> #include <math.h> #include <conio.h> #define n 5... подробнее

Показать сообщение отдельно
pro1004ok
1 / 1 / 0
Регистрация: 13.11.2008
Сообщений: 173

Перегрузка операторов - C++

20.11.2008, 23:47. Просмотров 1086. Ответов 0
Метки (Все метки)

Помогите верно перегрузить операторы >, < и операцию ввода в двусвязном списке.

LIST.cpp
Код
#include "iostream.h"
#include "conio.h"
#include "process.h"
#include<stdlib.h>
#include<stdio.h>
#include <string.h>

#include "list.h"

List :: List()
{
		head=NULL;
		kol_elem_in_list=0;
}

List :: List(int M[], int kol_elem)
{
	for(int i=0; i<kol_elem; i++)
	{
		insert(M[i]);
	}
	kol_elem_in_list=kol_elem;
}

List::List(const List &l)       //rabota konstr kopiy
 {
		cout << "Dlist copy constructor" << endl;

	 List_Item *p = l.head;

	 for(int i=l.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		 p = p->next;
	 }

	 for(i=l.kol_elem_in_list-1; i>= 0; i--)//nashinai s poslednego elementa dobavliaem v tekuchii obekt
	 {
		 insert(p->data);
		 p = p->prev;
	 }
	 kol_elem_in_list=l.kol_elem_in_list;
}

List :: List(char* String_of_val)
{
	int kol_chisel=0, i=0, Flag_in=0, Sim_counter=0, save_val=0;
	//List_Item *p;
	char *buf;

	//uznaem kolich shisel Rez v perem "kol_chisel"
	while (String_of_val[i]!='\0')
	{
	 if ( (String_of_val[i] != ' ') && ( i == 0) )
	 {
			kol_chisel++;
			i++;
			continue;
	 }
	 if ( (String_of_val[i] != ' ' ) && ( String_of_val[i-1] == ' ') )
	 {
			kol_chisel++;
			i++;
			continue;
	 }
	 i++;
	}

	//for 1-ogo chisra iz str
	buf = new char( strlen(String_of_val) - (2 * kol_chisel - 1) );
	buf[0]='\0';

	//razbor stroki
	kol_elem_in_list=0;
	i=0;
	while (String_of_val[i]!='\0')
	{
		if ( (String_of_val[i] != ' ') && ( i == 0) )//0-oi sim str zifra
		{
			buf[0]=String_of_val[0];
			Flag_in=1;
			Sim_counter=1;
			i++;
			continue;
		}
		if ( (Flag_in == 1) && (String_of_val[i+1] == '\0') )//posledni sim str zifra
		{
			buf[Sim_counter++]=String_of_val[i];
			buf[Sim_counter]='\0';
			sscanf(buf, "%d", &save_val);
			insert(save_val);
			Flag_in = 0;
			i++;
			continue;
		}

		if ( (Flag_in == 1) && (String_of_val[i] != ' ') )//vnutri chisla
		{
			buf[Sim_counter++]=String_of_val[i];
			i++;
			continue;
		}
		if ( (String_of_val[i] != ' ' ) && ( String_of_val[i-1] == ' ') )//chislo nachaloc
		{
			buf[0]=String_of_val[i];
			Flag_in=1;
			Sim_counter=1;
			i++;
			continue;
		}
		if ( (Flag_in == 1) && (String_of_val[i] == ' ') )//chislo zakonchilic
		{
			buf[Sim_counter]='\0';
			sscanf(buf, "%d", &save_val);
			insert(save_val);
			Flag_in = 0;
			i++;
			continue;
		}
		i++;
	}

}

List :: ~List()
{
 List_Item *p = head, *next;

 while ( (p->prev) != NULL )
 {
		 next = p->next;
		 delete p;
		 p = next;
 }
}

void List :: insert( int d )
{
 List_Item *p;
 p = new List_Item;

 p->data = d;
 p->next = head;
 p->prev = NULL;//
 if (head)
 {
		head->prev = p;
 }
 head = p;
// p->prev = NULL;
 kol_elem_in_list++;
}

void List :: print( )
{
 List_Item *p = head;

 cout << "\nKol elem: " << kol_elem_in_list << "\n";
 for(int i=0; i<kol_elem_in_list; i++)
 {
		 cout << p->data << "  ";
		 p = p->next;
 }
 if ( !getch() ) getch();
}


void List :: remove()
{
 List_Item *p = head;

 if (head==NULL)
 {
		cout <<"\nList is empty";
		exit(10);
 }
 else
 {
		if(kol_elem_in_list==1)
		{
			head=NULL;
		}
		else
		{
			head=head->next;
			head->prev=NULL;
		}
		delete p;
		kol_elem_in_list--;
 }
}

char* List :: concat(char *dst, const char *s1, const char *s2, size_t l1, size_t l2, size_t len)
{
 char temp[]=" ";

 memcpy(dst, s1, l1);
 memcpy(dst+l1, temp, 1);
 memcpy(dst + l1 + 1, s2, l2);
 dst[len]=0;

 return dst;
}

void List :: printToStr(char *String_of_val)
{
	char s1[50]="";

	char *str;
	size_t l1=0, l2=0, len=0;

	List_Item *p = head, *next;
	str = new char(250);
	str[0]='\0';
	String_of_val[0]='\0';

	while ( p != NULL )
	{
		sprintf(s1,"%d",p->data);
		next = p->next;

		l1=strlen(s1);
		l2=strlen(String_of_val);
		len= l1+l2+1;

		str=concat(str,String_of_val,s1,l2,l1,len);
		String_of_val[0]='\0';
		strcpy(String_of_val,str);
		s1[0]='\0';
		str[0]='\0';

		p = next;
	}
}

void List :: Raznost(List const &B)
{
	 List_Item *p = head;
	 List_Item *c = B.head;

	 for(int i=0; i<kol_elem_in_list; i++)
	 {
		 (p->data)= (p->data) - (c->data);
		 p=p->next;
		 c=c->next;
	 }
}

void List :: Summa(List const &B)

 {
	 List_Item *p = head;
	 List_Item *c = B.head;

	 for(int i=0; i<kol_elem_in_list; i++)
		{
		 (p->data)= (p->data) + (c->data);
			p = p->next;
			c = c->next;
										}
 }
int List :: Sravnenie(List const &B)
{
	List_Item *p = head;
	List_Item *c = B.head;

	 for(int i=0; i<kol_elem_in_list; i++)
	 {

		 if ( (p->data) != (c->data))
		 {
			cout  << "el ne ravni";
			return 0;
		 }
		 else
		 {
			 p = p->next;
			 c = c->next;
		 }
	}
	return 1;
}
LIST.h
Код
#include "iostream.h"
#include "conio.h"
#include "process.h"
#include<stdlib.h>
#include<stdio.h>
#include <string.h>
#ifndef _LIST
#define _LIST

struct List_Item
{
	List_Item *next, *prev;
	int data;
};

class List
{
 private:
	int kol_elem_in_list;
	List_Item *head;//ykaz na golovy spiska
 public:
	List();
	List(char *String_of_val);//konst srt
	List(int M[], int kol_elem);//konst mass
	List(const List &l); // konstruktor kopiy




	~List();
	void insert(int d);//ўбв*ўЄ* н«Ґ¬Ґ*в* б Ј®«®ўл
	void remove();//г¤*«Ґ*ЁҐ н«Ґ¬Ґ*в* б Ј®«®ўл
//	List operator+(const List &); //вставка элементов одного списка в хвост другого
//	List operator+(const List_Item);   //вставка строки из элемента в конец списка
//	List operator>(List);  //сравнивает длины списков, возвращает истину, если левый операнд длинее правого


	List& operator += (List&);
	List& operator -= (List&);

	friend ostream& operator << (ostream&, List&);
	friend List operator+ (List&, List&);
	friend List operator- (List&, List&);
  List& operator> (List&);

	void print();
	void printToStr(char *String_of_val);
	void Raznost(List const &B);
	void Summa(List const &B);
	int Sravnenie(List const &B);
	char* concat(char *dst, const char *s1, const char *s2, size_t l1, size_t l2, size_t len);
};

inline List& List:: operator += (List& b)
{
	List_Item *b1 = b.head;
	List_Item *c1 = head;

	for(int i=b.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		 (c1->data)=(c1->data)+(b1->data);
		 b1 = b1->next;
		 c1 = c1->next;
	 }
	 (c1->data)=(c1->data)+(b1->data);
	return *this;
}

inline List& List:: operator -= (List& b)
{
	List_Item *b1 = b.head;
	List_Item *c1 = head;

	for(int i=b.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		 (c1->data)=(c1->data)-(b1->data);
		 b1 = b1->next;
		 c1 = c1->next;
	 }
	 (c1->data)=(c1->data)-(b1->data);
	return *this;
}

inline ostream& operator << (ostream& str, List& l)
{
	List_Item *a = l.head;

	for(int i=0; i < l.kol_elem_in_list; i++)//dohodim do posled elem spiska
	 {
		 str << (a->data) << "  ";
		 a = a->next;
	 }
	return str; //<< (a->data);
}

inline List operator+ (List& a, List& b)
{
	List_Item *a1 = a.head;
	List_Item *b1 = b.head;
	List c(a);
	List_Item *c1 = c.head;

	for(int i=a.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		 (c1->data)=(a1->data)+(b1->data);
		 a1 = a1->next;
		 b1 = b1->next;
		 c1 = c1->next;
	 }
	 (c1->data)=(a1->data)+(b1->data);
	return c;
}

inline List operator- (List& a, List& b)
{
	List_Item *a1 = a.head;
	List_Item *b1 = b.head;
	List c(a);
	List_Item *c1 = c.head;

	for(int i=a.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		 (c1->data)=(a1->data)-(b1->data);
		 a1 = a1->next;
		 b1 = b1->next;
		 c1 = c1->next;
	 }
	 (c1->data)=(a1->data)-(b1->data);
	return c;
}

inline int operator > (List& a, List& b)
{
	List_Item *a1	=	head;
	List_Item *b1 = b.head;


	for(int i=a.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		if ((a1->data)>(b1->data))
			{
			cout <<"a>b";
			return 0;
			 {
				else
			 {

		 a1 = a1->next;
		 b1 = b1->next;

		 }
	}
	return 1;
}
	}


inline int operator < (List& a, List& b)
{
	List_Item *a1	=	head;
	List_Item *b1 = b.head;


	for(int i=a.kol_elem_in_list-1; i> 0; i--)//dohodim do posled elem spiska
	 {
		if ((a1->data)<(b1->data))
			{
			cout <<"a<b";
			return 0;
			 {
				else
			 {

		 a1 = a1->next;
		 b1 = b1->next;

	 }
	}
	return 1;
}
 }


#endif
3.cpp
Код
#include "list.h"

void main()
{
	clrscr();

	//1 bez param
	List i_list1;


	i_list1.insert(5);
	i_list1.insert(10);
	i_list1.insert(14);
	i_list1.insert(3);
	i_list1.insert(24);

	List i_list2(i_list1);
	List i_list3(i_list1);
//	i_list1+=i_list2; //1 variant slog
	i_list1=i_list2+i_list3; //2 variant slog
	i_list1.print();
	cout <<"\n";
	cout << i_list2; //peregruz
//	i_list2.print();
//	i_list3.print();

/*	i_list2.insert(5);
	i_list2.insert(10);
	i_list2.insert(14);
	i_list2.insert(3);
	i_list2.insert(2);

	i_list1.print();
	i_list2.print();

	i_list1.Raznost( i_list2 );
	i_list1.print();

	i_list1.Summa( i_list2 );
	i_list1.print();
	if (i_list1.Sravnenie( i_list2) ) cout << "OK";
	else 		cout  << "el ne ravni";
//	i_list1.print();
//	i_list2.print();

/*	//2 param mas
	int M[]={4, 2, 25, 16, 9, 3};
	int L[]={1, 2, 3, 6, 6, 2};

	List i_list2(M, 6);
	List i_list3(L, 6);
	i_list2.print();
	i_list3.print();

	i_list2.Raznost( i_list3 );

	i_list2.print();

/*
	//3 param srt
	char *String_of_val = "  10     2 3 91  " ;
	List i_list3(String_of_val);
	i_list3.print();

	//4 vivod v str
	char *rez_str;

	rez_str[0]='\0';
	i_list3.printToStr(rez_str);
	cout << "\n" << rez_str;
*/

	cout << "\nPress any key...........\n";
	getch();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru