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