Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C+;中将值插入类时会出现运行时错误+;_C++_Pointers_Runtime Error - Fatal编程技术网

C++ 为什么在C+;中将值插入类时会出现运行时错误+;

C++ 为什么在C+;中将值插入类时会出现运行时错误+;,c++,pointers,runtime-error,C++,Pointers,Runtime Error,我想得到一些帮助来解决这个问题。 我有一个名为Grades的类,其中包含指向该类学生的指针 class Grades { int numofstuds; Student** studs; public: void insertgrades(); void printgrades(); }; class Student { int id; int grade; public: void getId(); void getGrade(

我想得到一些帮助来解决这个问题。 我有一个名为Grades的类,其中包含指向该类学生的指针

class Grades {
    int numofstuds;
    Student** studs;
public:
    void insertgrades();
    void printgrades();
};

class Student {
    int id;
    int grade;
public:
    void getId();
    void getGrade();
    void printgrade();
};
我正在尝试将学生插入阵列螺柱:

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i]->getId();
        studs[i]->getGrade();
    }
}
当我试图在Id或等级中插入值时,立即出现运行时错误。 请帮忙! Isan。

您只创建了“框”来存储指向
学生的指针,但没有存储有效的指针

在使用之前,您必须创建学生

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i] = new Student(); // add this line
        studs[i]->getId();
        studs[i]->getGrade();
    }
}
void Grades::insertgrades(){
int i;
不能用木钉;
螺柱=新学生*[numof螺柱];
对于(i=0;igetId();
螺柱[i]>getGrade();
}
}
您只创建了“框”来存储指向
学生的指针,但没有存储有效的指针

在使用之前,您必须创建学生

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i] = new Student(); // add this line
        studs[i]->getId();
        studs[i]->getGrade();
    }
}
void Grades::insertgrades(){
int i;
不能用木钉;
螺柱=新学生*[numof螺柱];
对于(i=0;igetId();
螺柱[i]>getGrade();
}
}

感谢您的及时回复! 多亏了@MikeCAT,我才解决了这个问题。 我添加了另一个func来实际创建学生:

Student* createstud() {
    Student* News = new Student;
    return News;
}
然后我改变我的函数如下:

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        **studs[i] = createstud();**
        studs[i]->getId();
        studs[i]->getGrade();
    }
}
void Grades::insertgrades(){
int i;
不能用木钉;
螺柱=新学生*[numof螺柱];
对于(i=0;igetId();
螺柱[i]>getGrade();
}
}

不知道为什么创建Students**数组是个坏主意,因为我计划将来删除Students,这样在数组中更改指针就更容易了,不是吗?

谢谢您的即时回复! 多亏了@MikeCAT,我才解决了这个问题。 我添加了另一个func来实际创建学生:

Student* createstud() {
    Student* News = new Student;
    return News;
}
然后我改变我的函数如下:

void Grades::insertgrades() {
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student*[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        **studs[i] = createstud();**
        studs[i]->getId();
        studs[i]->getGrade();
    }
}
void Grades::insertgrades(){
int i;
不能用木钉;
螺柱=新学生*[numof螺柱];
对于(i=0;igetId();
螺柱[i]>getGrade();
}
}

不确定为什么创建Students**数组是个坏主意,因为我计划将来删除Students,这样更容易更改数组中的指针,不是吗?

MikeCAT的答案是正确的,但是请注意,您所做的操作很可能会导致内存泄漏。 显然,我还没有看到您的类析构函数-但是,除非您仔细地迭代Studs中的每个指针,调用delete[],然后在Studs上调用delete[],否则您将最终陷入一大堆泄漏的内存中

<>我想从你的语言中,你会更熟悉一些引用的语言,比如VisualBasic——C++中的内存分配,新的内存不能保证垃圾收集。 由于您没有存储
numberofstuds
,您将永远无法释放在MikeCAT答案中分配的内存

如果你可以使用C++ 11,考虑下面的代码片段来处理这个问题。

#include <memory>
#include <vector>
class Student;
class Grades {
    int numofstuds;
    std::vector<std::shared_ptr<Student> > studs;
public:
    void insertgrades();
    void printgrades();
};

MikeCAT的回答是正确的,但是请注意,您所做的操作很可能会导致内存泄漏。 显然,我还没有看到您的类析构函数-但是,除非您仔细地迭代Studs中的每个指针,调用delete[],然后在Studs上调用delete[],否则您将最终陷入一大堆泄漏的内存中

<>我想从你的语言中,你会更熟悉一些引用的语言,比如VisualBasic——C++中的内存分配,新的内存不能保证垃圾收集。 由于您没有存储
numberofstuds
,您将永远无法释放在MikeCAT答案中分配的内存

如果你可以使用C++ 11,考虑下面的代码片段来处理这个问题。

#include <memory>
#include <vector>
class Student;
class Grades {
    int numofstuds;
    std::vector<std::shared_ptr<Student> > studs;
public:
    void insertgrades();
    void printgrades();
};

这是作业吗?因为您最好使用标准容器而不是原始指针数组。为什么要使用双指针?从你使用它的方式来看,你应该有
Student*鞋钉newstudent*[numofstuds]
分配了一个
Student*
数组,但这些指针无效。@IsanRivkin
因为以后..
以后,你应该有机会学习如何使用容器而不是双星。这是课业吗?因为您最好使用标准容器而不是原始指针数组。为什么要使用双指针?从你使用它的方式来看,你应该有
Student*鞋钉newstudent*[numofstuds]
分配了一个
Student*
数组,但这些指针无效。@IsanRivkin
因为以后..
以后,你应该有机会学习如何使用容器,而不是双星。为什么要这样做呢?我们可以把它改成
Student*studs现在我们不必维护各级指针和两级删除。@NathanOliver,这是学校作业,教授已经决定折磨性地使用原始
new
delete
比使用标准容器更好。因此,可能会在两个层面上受到影响。但在这种情况下,您使用的
new
不正确。教
新的
是一回事,当你被告知这样使用它时又是另一回事。更好地使用
new
可以构建一个真正的动态数组类。你可以学习
新建
/
删除
、复制结构、作业等,比扔东西更有教育意义
class Grades 
{
    //snipped out everything else
    Student* studs;
}
void Grades::insertgrades() 
{
    int i;
    cout << "How many students ?" << endl;
    cin >> numofstuds;
    studs = new Student[numofstuds];
    for (i = 0; i < numofstuds; i++) {
        studs[i].getId();
        studs[i].getGrade();
    }
}
char A;
//the following pointer will *point to the location of A*
char * A_p = & A;
char Array[100];
//this pointer will *point to the data set Array*
char * Array_p = Array;
//this pointer *points to a newly allocated set of data*
char * B_p = new char [100];
//indeed, we can also do this 

//Set A to first character of array
A = *Array_p
A = Array_P[0]
A = *Array
A = Array[0]
//all of these do the same thing, as *when using an array, you're really using a pointer

delete [] B_P;