nkorobkov
@nkorobkov

Ошибка «нарушение прав доступа при исполнении по адресу...». В чем ошибка?

Задача - реализовать механизм позднего связывания и единый интерфейс при помощи виртуальных функций. Т.е. у нас есть базовый класс, (в моем случае - 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."
В чем моя ошибка и как ее исправить? Помогите пожалуйста решить проблему
  • Вопрос задан
  • 580 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы