В чем проблема с использованием массивов с классами? - PullRequest
0 голосов
/ 26 января 2020

Я работал над проектом для своего класса по информатике и столкнулся с проблемой при работе кода. Мне не показывают ошибки, за исключением случаев, когда я пытаюсь скомпилировать, и получаю сообщение об ошибке:

Исключение: нарушение прав записи. _Left был 0x CCCCCCCC.

Цель моего проекта - взять список имен из внешнего файла, прочитать их в массив, отсортировать указанный массив и затем вывести отсортированный список, используя класс для кода. Вот копия моего кода, и я хотел бы выразить свою благодарность тому, кто поможет мне решить мою проблему:

**Header File**

#include <iostream>


using namespace std;


class person
{
public:
    person();
    bool get(ifstream&);
    void put(ofstream&);

private:
    int capacity = 0;
    string first_name[CAPACITY];
    string last_name[CAPACITY];
    int age[CAPACITY];



};```

**Header function definitions cpp file**

#include<iostream>
#include<string>
#include<fstream>
#include<cstdlib>

const int CAPACITY=20;
using namespace std;

#include "Person.h"

//Names constructor
//Postcondition both first name and last name initialized to zero


person::person()
{
    first_name[CAPACITY] = "";
    last_name[CAPACITY] = "";
    age[CAPACITY]=0;

}

bool person::get(ifstream& in)
{
    in >> first_name[CAPACITY] >> last_name[CAPACITY] >> age[CAPACITY];
    return(in.good());

}
void person::put(ofstream &out)
{
    out << first_name[CAPACITY] << last_name[CAPACITY] << age[CAPACITY];
}

**cpp file which holds main**

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>

const int CAPACITY = 20;
using namespace std;
#include "Person.h"


void pop(string *xp, string *yp);
void sort(string name[CAPACITY], int count);

int main()
{
    class person names[CAPACITY];
    ifstream infile;
    ofstream outfile;
    string filename;
    string name[CAPACITY];
    int n = 0;

    cout << "Enter the file name you wish to open" << endl;
    cin >> filename;
    infile.open(filename + ".txt");
    outfile.open("Person_New.txt");

    if (infile.fail())
    {
        cout << "The file requested did not open" << endl;
        exit(1);
    }
    while (!infile.eof())
    {
        names[n].get(infile);
        n++;
    }
    sort(name, CAPACITY);
    for (int i = 0; i < CAPACITY; i++)
    {
        names[i].put(outfile);
    }
    cout << "The file has been created" << endl;

    infile.close();





}
void pop(string *xp, string *yp)
{
    string temp = *xp;
    *xp = *yp;
    *yp = temp;
}
void sort(string name[CAPACITY], int count)
{
    int i, j;
    for (i = 0; i < count - 1; i++)
    {

        for (j = 0; j < count - i - 1; j++)
        {
            if (name[j] > name[j + 1])
            {
                pop(&name[j], &name[j + 1]);
            }

        }
    }
} 

Once again Thank you for any support

1 Ответ

0 голосов
/ 26 января 2020

Мне кажется, что компилятор расстраивается из-за того, что вы пытаетесь написать (т.е. присвоить значение) по адресу, к которому у вас нет прав доступа. Я считаю, что ваш конструктор для класса person может быть виноват из-за того, как этот класс хранит свои переменные, а также заголовок класса:

Конструктор для класса person:

`person::person(){
    first_name[CAPACITY] = "";
    last_name[CAPACITY] = "";
    age[CAPACITY] = 0;
}`

Заголовок класса для персоны класса:

`class person{
    public:
        //stuff
    private:
        int capacity = 0;
        std::string first_name[CAPACITY];
        std::string last_name[CAPACITY];
        int age[CAPACITY];
        //more stuff
}`

C ++ очень специфичен c в отношении соглашений об именах, поэтому он делает различие между capacity и CAPACITY. Из-за этого переменная CAPACITY не определена в файле Person.h.

Кроме того, поскольку CAPACITY имеет фиксированное значение в файле Person. cpp, всякий раз, когда вы используете first_name[CAPACITY], last_name[CAPACITY] или age[CAPACITY] для назначения новых значений, вы обновляете значения только с индексом, равным CAPACITY, если только вы не обновите само значение CAPACITY. В предоставленном вами коде CAPACITY равно 20, поэтому ваша программа пытается обновлять исключительно индекс 20 при каждом вызове метода. Скорее всего, это вызовет проблемы, поскольку класс person пытается создать свои массивы только в стеке времени выполнения с размером 0 в каждом.

Отдельно кажется, что вам нужен массив людей, но он появляется что вы пытаетесь использовать объект из одного человека для хранения имен и возрастов нескольких людей, создавая все эти массивы. Вместо этого я бы рекомендовал делать first_name, last_name и age не массивами , а отдельными переменными. Затем вы можете манипулировать массивом типа person, используя переменную CAPACITY. Вы подошли довольно близко, но вместо этого вы можете объявить его как person myPersonArray[CAPACITY] (не нужно упоминать "class" перед ним - просто убедитесь, что у вас есть #include "Person.h" в вашем основном файле. cpp). Когда вы хотите обновить определенного c человека, вы можете выполнить операцию, подобную myPersonArray[updateThisIndexNum].update(newFirstName, newLastName, newAge) или некоторому логическому эквиваленту.

В качестве последнего замечания, я почти всегда настоятельно рекомендую не использовать !infile.eof() для управления вашим в то время как l oop при чтении любого файла, потому что eof() только указывает, пытались ли вы прочитать после конца входного файла . Я очень рекомендую проверить этот пост на Переполнении стека, где люди, намного более знающие, чем я, объясняют, почему это обычно опасно и как этого избежать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...