我在使用带有类的数组时遇到啥问题?

Posted

技术标签:

【中文标题】我在使用带有类的数组时遇到啥问题?【英文标题】:What is the problem I am having with using arrays with classes?我在使用带有类的数组时遇到什么问题? 【发布时间】:2020-01-25 22:51:34 【问题描述】:

我一直在为我的计算机科学课做一个项目,但遇到了代码工作的问题。我没有显示任何错误,除非我尝试编译并收到错误消息:

抛出异常:写访问冲突。 _左边是 0xCCCCCCCC。

我的项目的目的是从外部文件中获取名称列表,将它们读入数组,对所述数组进行排序,然后在使用代码类的同时输出排序后的列表。 这是我的代码的副本,我想感谢任何可以帮助我解决我的问题的人:

**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

【问题讨论】:

person 类中不需要 any 数组。而且您使用它们不正确 - [CAPACITY]声明 数组和使用 数组时意味着不同。 main 中的 name 数组永远不会用任何有用的东西初始化 - 你所拥有的只是空字符串。请注意,它与您的 names 数组完全无关。还有Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong? 我不认为你应该这样使用字符串 我建议放弃您目前用于学习 C++ 的资源,转而使用 a good book。 C++ 不是一门简单的语言,正确使用它更难。 在许多其他事情中,像`first_name[CAPACITY] = "";`这样的语句写在数组的末尾。在您的情况下,有效的数组索引是 0...CAPACITY-1 不要使用数组,而是使用std::vector 【参考方案1】:

在我看来,编译器对您尝试在您无权访问的地址写入(即分配值)感到不安。我相信你的 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++ 对其命名约定非常具体,因此它区分了capacityCAPACITY。因此,变量CAPACITY 未在 Person.h 文件中定义。

另外,因为 CAPACITY 在您的 Person.cpp 文件中设置为固定值,所以无论何时使用 first_name[CAPACITY]last_name[CAPACITY]age[CAPACITY] 分配新值,您只是在更新索引等于CAPACITY,除非您更新CAPACITY 本身的值。在您提供的代码中,CAPACITY 等于 20,因此您的程序尝试使用每个方法调用专门更新索引 20。这可能会导致问题,因为 person 类仅尝试在运行时堆栈上创建其数组,每个数组的大小为 0。

另外,您似乎想要一个人数组,但您似乎正试图通过制作这些所有数组来使用单个人对象来存储多个人的姓名和年龄。相反,我建议制作first_namelast_nameage 不是 数组,而是单个变量。然后,您可以使用您的CAPACITY 变量来操作person 类型的数组。您已经非常接近了,但您可以将其声明为 person myPersonArray[CAPACITY](无需在其前面提及“类”——只需确保您的 main.cpp 文件中有 #include "Person.h")。当您想更新特定的人时,您可以执行myPersonArray[updateThisIndexNum].update(newFirstName, newLastName, newAge) 之类的操作或一些逻辑等效项。

最后一点,我几乎总是强烈建议不要在读取任何文件时使用!infile.eof() 来控制您的 while 循环,因为eof() 仅表明您是否尝试读取输入文件的末尾。我强烈建议您查看 Stack Overflow 上的 this post,那里的人比我知识渊博,确切地解释了为什么这通常很危险以及如何避免它。

【讨论】:

以上是关于我在使用带有类的数组时遇到啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

带有快速数组参数的节点mysql批量插入

我在使用带有电子的 vue js 进行捆绑时遇到问题

创建用户定义类的实例并打开文件后 memset 出现问题

如何在单击多个项目时使用 jQuery 循环遍历数组?

如何将带有数组的对象转换为数组

将数组动态分配到带有指针参数的函数中