У меня базовый класс с двумя виртуальными методами и два класса-наследника. В функции main есть массив указателей на базовый класс, который может так же содержать указатели на объекты дочерних классов. В целом всё в программе не полохо до попытки очистить память, выделенную под элементы массива. При попытке использовать delete программа крашится и выдаёт ошибку сегментации
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
////////////////////////////////////////////////////////////////////////////////
class publication // базовый класс
{
private:
string name;
float price;
public:
publication() : name("N/A"), price(0.0)
{}
publication(string n, float p) : name(n), price(p)
{}
virtual void getdata() // те самые виртуальные методы
{
cout << "\nВведите название книги: "; cin >> name;
cout << "Введите цену: "; cin >> price;
}
virtual void putdata()
{
cout << "\nНазвание: " << name;
cout << "\nЦена: " << price;
}
virtual ~publication() // виртуальный деструктор (текст выводил для отладки, но это не помогло опреденить проблему)
{cout << "publication destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
class book : public publication
{
private:
int pages;
public:
book() : publication(), pages(0)
{}
book(string n, float p, int pa) : publication(n, p), pages(pa)
{}
void getdata()
{
publication::getdata();
cout << "\nВведите количество страниц: "; cin >> pages;
}
void putdata()
{
publication::putdata();
cout << "\nКоличество страниц: " << pages;
}
~book()
{cout << "book destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
class tape : public publication
{
private:
float rectime;
public:
tape() : publication(), rectime(0.0)
{}
tape(string n, float p, float rec) : publication(n, p), rectime(rec)
{}
void getdata()
{
publication::getdata();
cout << "Введите время записи: "; cin >> rectime;
}
void putdata()
{
publication::putdata();
cout << "\nВремя записи: " << rectime;
}
~tape()
{cout << "tape destructor" << endl;}
};
////////////////////////////////////////////////////////////////////////////////
int main()
{
publication* pubptr[10];
char choice;
int pubtype;
int lenofarr = 0;
for(int i = 0; i < 10; i++) // ввод значений в массив
{
cout << "Выберете тип публикации (1 - book; 2 - tape)";
cin >> setw(4) >> pubtype;
switch(pubtype)
{
case 1: pubptr[i] = new book; break;
case 2: pubptr[i] = new tape; break;
default: cout << "Не верно" << endl;
}
pubptr[i]->getdata();
lenofarr++;
cout << "Хотите продолжить?(y/n): ";
cin >> choice;
if(choice != 'y')
break;
}
for(int i = 0; i < 100; i++) // вывод содержимого массива
{
pubptr[i]->putdata(); cout << endl;
}
for(int i = 0; i < lenofarr; i++) // удаление элементов
delete pubptr[i];
return 0;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Возможно ли реализовать реализовать именно расширение памяти? Или хотя бы при помощи манипуляций с указателями избежать лишнего копирования...
Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке
У меня есть массив и я его изменил алгоритмом Фишера-ЙетсаПроблема заключается в том, что у меня числа в измененном массиве начинаются с нуля,...
Всем здравствуйтеТакая проблема: печатается только первый элемент с отступом, а все остальные без отступа