Выбивает ошибку когда перехожу на перегрузку оператор сложения (+)
Думаю, проблема в методе 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";
}