Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2014, 14:37   #1
Dumbl-D
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 26
По умолчанию С++ Перегрузка операторов

Выбивает ошибку когда перехожу на перегрузку оператор сложения (+)
Думаю, проблема в методе get(). Но все не могу понять какая.
Помогите, пожалуйста.

Код:
#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <iomanip>
#define N 3  

using namespace std;

class complect
{
	char *nazva;
	char *tip;
	int nom;
	float kilk;
	friend ostream & operator<<(ostream &stream, complect &o1); 
	friend istream & operator>>(istream &stream, complect &o1); 
	friend void shapka(void);
	friend void linebuild(void);
	friend int isvalid(int a, int b);
public:
	complect() { nom=0; kilk=0;}
	complect(char *a, char *b, int c, float d);
	void set(char *a, char *b, int c, float d);
	void get(char *a, char *b, int c, float d);
	void show(void);
	complect operator = (complect &o1); 
	int operator == (complect &o1); 
	complect operator + (complect &o1);
};

 ostream & operator<<(ostream &stream, complect &o1) {
	shapka();
	stream<<"|"<<setw(17)<<o1.nazva<<"  |  ";
	stream<<setw(14)<<o1.tip<<"|";
	stream<<setw(18)<<o1.nom<<"  |";
	stream<<setw(17)<<o1.kilk<<"  |"<<endl;
	linebuild();
 return stream;
 }

istream & operator>>(istream &stream, complect &o1) 
{
	cout<<"Обозначение, Тип, Номинал, Количество: \n";
	stream>>o1.nazva;
	stream>>o1.tip;
	stream>>o1.nom;
	stream>>o1.kilk;
	return stream;
}

int isvalid(int a, int b){
  if (((a>N-1) || (a<0)) || ((b>N-1) ||(b<0)))
   {
    cout<<"Ошибка! Экземпляра с таким индексом не существует.\n";
    getch();
    return -1;
   }
  else if (a==b)
   {
    cout<<"Ошибка! Экземпляр не может быть записан сам в себя.\n";
    getch();
    return -2;
   }
 return 0;
}

complect complect::operator + (complect &o1) {
	complect tr;
	int i,j;
	delete[] tr.nazva;
	delete[] tr.tip;
	tr.nazva=new char [strlen(nazva)+strlen(o1.nazva)+2]; 
	strcpy(tr.nazva,nazva);
	strcat(tr.nazva, o1.nazva);
	tr.tip=new char [strlen(tip)+strlen(o1.tip)+2]; 
	strcpy(tr.tip,tip);
	strcat(tr.tip, o1.tip);
	tr.nom=nom+o1.nom;
	tr.kilk=kilk+o1.kilk;
	return tr;
}

int complect::operator == (complect &o1) {
	if (nom!=o1.nom) {cout << "Данные экземпляры класса не равны."; getch();}
		else if (ceil(kilk)!=ceil(o1.kilk)) {cout << "Данные экземпляры класса не равны."; getch();}
			else if (strcmp(nazva,o1.nazva) != 0) {cout << "Данные экземпляры класса не равны."; getch();}
				else if (strcmp(tip,o1.tip) != 0) {cout << "Данные экземпляры класса не равны."; getch();}
					else cout<<"Экземпляры класса равны."; getch();
	return 0;
}

complect complect::operator = (complect &o1) {
	delete []nazva;
	delete []tip;
	nazva = new char [strlen(o1.nazva)+2];
	if (!nazva) {
		cout<<"Ошибка! Память не выделена.";
		exit(1);
	}
	strcpy(nazva,o1.nazva);
	tip = new char [strlen(o1.tip)+2];
	if (!tip) {
		cout<<"Ошибка! Память не выделена.";
		exit(1);
	}
	strcpy(tip,o1.tip);
	nom = o1.nom;
	kilk = o1.kilk;
	return o1;
}

complect::complect(char *a, char *b, int c, float d) {
	nazva=new char [strlen(a)+1];
	strcpy(nazva,a);
	tip=new char [strlen(b)+1];
	strcpy(tip,b);
	nom=c;
	kilk=d;
}


void complect::set(char *a,char *b, int c,float d) {
	strcpy(nazva,a);
	strcpy(tip,b);
	nom=c;
	kilk=d;
}

void complect::show(void) {
	cout<<nazva<<"       ";
	cout<<tip<<"    ";
	cout<<nom<<"    ";
	cout<<kilk<<"   ";
}

void complect::get( char *a, char *b, int c, float d)
{
	delete[] a;
	delete[] b;
	a=new char [strlen(nazva)+1];
	b=new char [strlen(tip)+1];
	strcpy(a,nazva);
	strcpy(b,tip);
	c=nom;
	d=kilk;
	cout<<a<<" ";
	cout<<b<<" ";
	cout<<c<<" ";
	cout<<d<<" ";
	cout<<"\n";
}

void shapka(void)
{
	cout<<"_______________________________________________________________\n";
	cout<<"|              Ведомость комплектующих                        |\n";
	cout<<"|-------------------------------------------------------------|\n";
	cout<<"|  Обозначение:    |Тип:         |Номинал:   |Количество :    |\n";
	cout<<"|-------------------------------------------------------------|\n";
 }

void linebuild(void)
{
	cout<<"\n|-------------------------------------------------------------|\n";
}
Dumbl-D вне форума Ответить с цитированием
Старый 12.10.2014, 14:37   #2
Dumbl-D
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 26
По умолчанию

Код:
int main(void)
{
	setlocale(LC_ALL, "Russian");
	char *n;
	char *t;
	int s;
	float h;
	short i,k;
	int s1;
	short q,q1;

	complect obj[N] = {complect("RT-11-24","R",200,36.5),
		       complect("RT-11-24","R",500,10.8),
		       complect("CG-12-1K","C",110,30.3)};
 cout<<"Обозначение, Тип, Номинал, Количество: \n";
 for (i=0; i<N; i++) {
  obj[i].show();
  cout<<"\n";
  }

 cout<<"\nПерегрузка оператора присваивания '='.\n";
 cout<<"Введите номера экземпляров класса: заменяемый и заменяющий>\n";
 cin>>q;
 cin>>q1;
 if (isvalid(q, q1)!=0) exit(-1);
 obj[q] = obj[q1];  

  cout<<"Обозначение, Тип, Номинал, Количество: \n";
  for(i=0; i<N; i++) {
   obj[i].show();
   cout<<"\n";
  }

 cout<<"\nПерегрузка оператора соответствия '=='.\n";
 cout<<"Введите номера экземпляров класса, которые надо сравнить>\n";
 cin>>q;
 cin>>q1;
 if (isvalid(q, q1)!=0) exit(-1);
 obj[q] == obj[q1];  

 cout<<"\nПерегрузка оператора суммы '+'.\n";
 cout<<"Введите номера экземпляров класса, которые надо сложить>\n";
 cin>>q;
 cin>>q1;
 complect temp;
 if (isvalid(q, q1)!=0) exit(-1);
 temp=obj[q]+obj[q1];  
   cout<<"Обозначение, Тип, Номинал, Количество: ";
   temp.get(n,t,s,h);

 cout<<"\nПерегрузка оператора потокового ввода '>>'.";
 cout<<"\nВведите номер экземпляра класса: ";
 cin>>q;
 if ((q>N-1)||(q<0)) {cout<<"Ошибка! Экземпляра с таким индексом не существует."; getch(); exit(-1);}
 cin>>obj[q]; 

 cout<<"\nПерегрузка оператора потокового вывода '<<'.";
 cout<<"\nВведите номер экземпляра класса: ";
 cin>>q;
 if ((q>N-1)||(q<0)) {cout<<"Ошибка! Экземпляра с таким индексом не существует."; getch(); exit(-1);}
 cout<<obj[q]; 

 getch();
 return 0;
}
Dumbl-D вне форума Ответить с цитированием
Старый 12.10.2014, 16:22   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Что за ошибка?
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов (С++) lolk Помощь студентам 2 31.05.2012 12:10
Перегрузка операторов riko782 Помощь студентам 10 06.05.2012 23:28
Перегрузка операторов Leo_ня Общие вопросы C/C++ 7 10.04.2011 15:52
Перегрузка операторов raspberry Общие вопросы C/C++ 2 06.04.2010 00:19
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15