на конструктор по умолчанию для нельзя ссылаться, так как эта функция удалена
Писал код, вроде все правильно но появилась ошибка. Об'ясните пожалуйста что делать.Код:
#include<iostream>
#include<string>
#include <windows.h>
using namespace std;
struct AEROFLOT
{
string NAZN;
int NUMR;
string TIP;
int TRANS;
union TIME {
TIME() {}
~TIME() {}
string NAZV;
bool TIM;
} TIME;
};
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
AEROFLOT AIPORT[7]; /*Ошибка в этом месте. на конструктор по умолчанию для "AEROFLOT" нельзя ссылаться, так как эта функция удалена*/
int n = 0, i;
string nazva;
while (n < 7)
{
cout << "Внесіть данні по рейс згідно його номеру "
<< n + 1 << ":" << endl << "Введіть назву пункту призначення: \n";
cin >> AIPORT[n].NAZN;
cout << "Введіть номер рейсу: \n";
cin >> AIPORT[n].NUMR;
cout << "Введіть тип літака: \n";
cin >> AIPORT[n].TIP;
cout << "Літак з пересадками?(Так - 1, ні - 2): \n";
cin >> AIPORT[n].TRANS;
if (AIPORT[n].TRANS == 1) {
cout << "Введіть пункт пересадки: \n";
cin >> AIPORT[n].TIME.NAZV;
}
else {
cout << "Введіть час польоту: \n";
cin >> AIPORT[n].TIME.TIM;
}
n++;
}
cout << "Введіть назву потрібного вам рейсу: ";
cin >> nazva;
n = 0;
while (n < 7)
{
if (AIPORT[n].NAZN == nazva) {
cout << "Потрібний вам літак: \nПункт призначення:" << AIPORT[n].NAZN << "\nНомер рейсу: " << AIPORT[n].NUMR << "\nТип літака: " << AIPORT[n].TIP;
if (AIPORT[n].TRANS == 1) {
cout << "\nРейс з пересадкою в пункті - " << AIPORT[n].TIME.NAZV << "\nГарної подорожі!";
}
else {
cout << "\nРейс без пересадок. Час подорожі становить: " << AIPORT[n].TIME.TIM << "\nГарної подорожі!";
}
break;
}
else {
i = 0;
i++;
if (i == 7)
cout << "\nПотрібного рейсу немає в базі. Гарного дня!";
}
n++;
}
system("pause");
}
После ответа я исправил код и появилось несколько проблем, из-за чего работа программы прерывается когда наступает момент объединения.
Ответы (2 шт):
Для union не имеется конструктора по умолчанию, так что и AEROFLOT неизвестно как создавать...
Можно, конечно, явно дописать конструктор-деструктор:
union TIME {
TIME(){}
~TIME(){}
string NAZV;
bool TIM;
} TIME;
и все заработает, но поясните мне, зачем вы используете объединение? Что оно вам дает, кроме лишней головной боли? Экономия памяти? по сути никакой. А сложностей — хотя бы с теми же конструкторами-деструкторами — хватает.
Ошибка достаточно прямолинейна - все используемые объекты должны быть инициализированы. И если у std::string и так есть нетривиальный конструктор по-умолчанию, то все int и enum остаются неициализированы. В случае enum еще дополнительно надо отслеживать активное поле и еще и явно его разрушать:
struct AEROFLOT
{
string NAZN;
int NUMR;
string TIP;
int TRANS;
union TIME {
TIME(void): TIM{} {}
~TIME(void) {}
string NAZV;
bool TIM;
} TIME;
AEROFLOT(void)
: NAZN{}
, NUMR{}
, TIP{}
, TRANS{}
, TIME{}
{
return;
}
~AEROFLOT(void)
{
if (TRANS)
{
TIME.NAZV.~string();
}
else
{
TIME.TIM.~bool();
}
return;
}
};
Соответственно и при каждом изменении поля надо будет разрушать текущее поле и инициализировать другое:
if (AIPORT[n].TRANS == 1)
{
cout << "Введіть пункт пересадки: \n";
AIPORT[n].TIME.TIM.~bool();
new (::std::addressof(AIPORT[n].TIME.NAZV)) ::std::string{};
cin >> AIPORT[n].TIME.NAZV;
}
else
{
cout << "Введіть час польоту: \n";
cin >> AIPORT[n].TIME.TIM;
}