В чем заключается ошибка при присвоении информации классу
Вот код примера, не понимаю, что надо сделать в данном этапе:
church obj[N] = {
church("Тодайдзи","Т",220,368.8),
church ("Якусидзи","С",50,54.7),
church("Дайандзи","Д",10,12.2) };
Полный текст программы -
#define _CRT_SECURE_NO_WARNINS
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <iomanip>
#define N 3 //количество экземпляров класса
using namespace std;
class church {
char *name;
char *school;
unsigned int count;
float square;
public:
friend ostream & operator<<(ostream &stream, church &o1);
friend istream & operator>>(istream &stream, church &o1);
friend void shapka(void);
friend void linebuild(void);
friend int isvalid(int a, int b);
church() { square = 0; count = 0; }
church(const char *a, const char *b, unsigned int &c, float &d);
void setall(char *a, char *b, unsigned int, float);
void getall(char *a, char *b, unsigned int &c, float &d);
void showall(void);
church operator = (church &o1);
int operator == (church &o1);
church operator + (church &o1);
};
ostream & operator<<(ostream &stream, church &o1) {
shapka();
stream << "|" << setw(10) << o1.name << " | ";
stream << setw(5) << o1.school << "|";
stream << setw(18) << o1.count << " |";
stream << setw(17) << o1.square << " |" << endl;
linebuild();
return stream;
}
istream & operator>>(istream &stream, church &o1) {
cout << "Название, Школа, Количество монахов, Площадь земли: \n";
stream >> o1.name;
stream >> o1.school;
stream >> o1.count;
stream >> o1.square;
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;
}
church church::operator + (church &o1) {
church tr;
int i, j;
delete[] tr.name;
delete[] tr.school;
tr.name = new char[strlen(name) + strlen(o1.name) + 2];
strcpy(tr.name, name);
strcat(tr.name, o1.name);
tr.school = new char[strlen(school) + strlen(o1.school) + 2];
strcpy(tr.school, school);
strcat(tr.school, o1.school);
tr.count = count + o1.count;
tr.square = square + o1.square;
return tr;
}
int church::operator == (church &o1) {
if (count != o1.count) { cout << "Данные экземпляры класса не равны."; _getch(); }
else if (ceil(square) != ceil(o1.square)) { cout << "Данные экземпляры класса не равны."; _getch(); }
else if (strcmp(name, o1.name) != 0) { cout << "Данные экземпляры класса не равны."; _getch(); }
else if (strcmp(school, o1.school) != 0) { cout << "Данные экземпляры класса не равны."; _getch(); }
else cout << "Экземпляры класса равны."; _getch();
return 0;
}
church church::operator = (church &o1) {
delete[] name;
delete[] school;
name = new char[strlen(o1.name) + 2];
if (!name) {
cout << "Ошибка! Память не выделена.";
exit(1);
}
strcpy(name, o1.name);
school = new char[strlen(o1.school) + 2];
if (!school) {
cout << "Ошибка! Память не выделена.";
exit(1);
}
strcpy(school, o1.school);
count = o1.count;
square = o1.square;
return o1;
}
church::church(const char *a, const char *b, unsigned int &c, float &d) {
name = new char[strlen(a) + 1];
strcpy(name, a);
school = new char[strlen(b) + 1];
strcpy(school, b);
count = c;
square = d;
}
void church::setall(char *a, char *b, unsigned int c, float d) {
strcpy(name, a);
strcpy(school, b);
count = c;
square = d;
}
void church::showall(void) {
cout << name << " ";
cout << school << " ";
cout << count << " ";
cout << square << " ";
}
void church::getall(char * a, char *b, unsigned int &c, float &d)
{
delete[] a;
delete[] b;
a = new char[strlen(name) + 1];
b = new char[strlen(school) + 1];
strcpy(a, name);
strcpy(b, school);
c = count;
d = square;
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";
}
int main(void) {
char *n;
char *t;
unsigned int s;
float h;
short i, k;
unsigned int s1;
short q, q1;
church obj[N] = { church("Тодайдзи","Т",220,368.8),
church ("Якусидзи","С",50,54.7),
church("Дайандзи","Д",10,12.2) };
system("cls");
cout.precision(2);
cout << "Название, Школа, Количество монахов, Площадь земли: \n";
for (i = 0; i < N; i++) {
obj[i].showall();
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].showall();
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;
church temp;
if (isvalid(q, q1) != 0) exit(-1);
temp = obj[q] + obj[q1];
cout << "Наименование, Тип, Посевная площадь, Урожайность: ";
temp.getall(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;
}
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
Проблема в вашем конструкторе и его использовании
конструктор:
church(const char *a, const char *b, unsigned int &c, float &d);
использование:
church("Тодайдзи","Т",220,368.8)
ссылки на значения c++ не умеет
сделайте так:
church(const char *a, const char *b, unsigned int c, float d);
Зачем вообще в конструктор передавать по ссылке int? Особенно если не собираетесь в них писать.
Даже лучше так:
church(const char *a, const char *b, const unsigned int c, const float d);