Задача - реализовать механизм позднего связывания и единый интерфейс при помощи виртуальных функций. Т.е. у нас есть базовый класс, (в моем случае - element) и два производных класса, element_metall и element_nemetall. В производных классах есть свои дополнительные поля: для элементов-металлов это hardness и melting_temp, а для неметаллов - solubility. Для обработки (вывода на экран, записи в файл и чтения из файла) этих полей производных классов я использовал виртуальные функции.
Вот код реализации виртуальных функций:spoiler#include <string>
#include <fstream>
#include <iostream>
#include "Elements.h"
using std::string;
using std::ifstream;
using namespace std;
//ФУНКЦИИ БАЗОВОГО КЛАССА
//Функция вывода информации об 1-ом элементе на экран
void element::display() {
cout << "\n==================================\n";
cout << " Название: " << name << endl;
cout << " Символ: " << symbol << endl;
cout << " Номер: " << number << endl;
cout << " Тип: " << type << endl;
cout << " Масса: " << mass << endl;
cout << " Эл. конфигурация: " << electrons << endl;
}
//Функция чтения информации об 1-ом элементе из файла
void element::read_from(ifstream &file) {
file >> name;
file >> symbol;
file >> number;
file >> type;
file >> mass;
file >> electrons;
}
//Функция записи информации об 1-ом элементе в файл
void element::write_to(ofstream &file) {
file << name << " ";
file << symbol << " ";
file << number << " ";
file << type << " ";
file << mass << " ";
file << electrons << "";
}
float element::get_mass() {
return mass;
}
string element::get_type() {
return type;
}
string element::get_name() {
return name;
}
//МЕТОДЫ МЕТАЛЛОВ
void element_metall::display() {
element::display();
cout << " Плотность: " << hardness << endl;
cout << " Температура плавления: " << melting_temp << endl;
}
void element_metall::read_from(ifstream &file) {
element::read_from(file);
file >> hardness;
file >> melting_temp;
}
void element_metall::write_to(ofstream &file) {
element::write_to(file);
file << hardness << " ";
file << melting_temp << endl;
}
float element_metall::get_hardness() {
return hardness;
}
float element_metall::get_melting_temp() {
return melting_temp;
}
//МЕТОДЫ НЕМЕТАЛЛОВ
void element_nemetall::display() {
element::display();
//cout << " Эл. конфигурация: " << electrons << endl;
cout << " Растворимость: " << solubility << endl;
}
void element_nemetall::read_from(ifstream &file) {
element::read_from(file);
file >> solubility;
}
void element_nemetall::write_to(ofstream &file) {
element::write_to(file);
file << solubility << endl;
}
float element_nemetall::get_solubility() {
return solubility;
}
Вот код класса-контейнера:spoiler#include "ChymTable.h"
#include <iostream>
#include "stdafx.h"
using namespace std;
//Конструктор класса-контейнера
ChymTable::ChymTable(unsigned int max_elements) {
max_num_elements = max_elements;
pt_elements = new element*[max_num_elements];
num_elements = 0;
cout << "\nВызван конструктор класса ChymTable.";
cout << "\n --- выделено объектов: " << max_num_elements;
cout << "\n --- загружено элементов: " << num_elements << endl;
}
//Деструктор класса-контейнера
ChymTable::~ChymTable() {
delete[] pt_elements;
max_num_elements = 0;
num_elements = 0;
cout << "\nВызван деструктор класса ChymTable.\nВыделенная память освобождена." << endl;
}
void ChymTable::add_element(element aelement) {
if (num_elements < max_num_elements) {
pt_elements[num_elements] = &aelement;
num_elements++;
}
}
void ChymTable::read_elements_from_file(string filename) {
ifstream infile;
infile.open(filename);
if (!infile.is_open()) {
cout << "Файл с данным именем не найден!" << endl;
system("pause");
exit(1);
}
int N;
infile >> N;
infile.get();
for (int i = 0; i < N; i++) {
element new_element;
new_element.read_from(infile);
add_element(new_element);
}
infile.close();
cout << "Загружены элементы из файла " << filename << ".";
cout << "\n --- число загруженных элементов: " << num_elements << endl;
};
void ChymTable::write_elements_to_file(string filename) {
ofstream outfile;
outfile.open(filename);
outfile << num_elements << endl;
for (int i = 0; i < num_elements; i++) {
pt_elements[i]->write_to(outfile);
}
outfile.close();
cout << "Элемнеты записаны в файл " << filename << ".";
cout << "\n --- число записанных элементов: " << num_elements;
}
void ChymTable::display_all_elements() {
for (int i = 0; i < num_elements; i++) {
pt_elements[i]->display();
}
}
void ChymTable::find_element_by_mass(float amass) {
for (int i = 0; i < num_elements; i++) {
if (pt_elements[i]->get_mass() == amass) {
cout << "\n\nЭлемент с введенной атомной массой найден!" << endl;
pt_elements[i]->display();
}
}
}
Прогtрамма нормально работает до места, где нужно вывести записанные из файла элементы в консоль (функция
display_all_elements). На этом месте VStudio выдает ошибку "
Вызвано исключение по адресу 0x010CD060 в Lab6.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x010CD060."
В чем моя ошибка и как ее исправить? Помогите пожалуйста решить проблему