如何实现对象指针的动态数组? "expression must be a modifiable lvalue"

How to implement a dynamic array of object pointers? "expression must be a modifiable lvalue"

本文关键字:expression must be lvalue modifiable 数组 动态 何实现 实现 指针 对象      更新时间:2023-10-16

我是一名c++学生,这是我在这里的第二篇文章。我正在处理一个类,它的工作是维护一个对象指针数组。(这样就可以将指针传入并添加到数组中,而不是整个对象。)数组应该是动态的,但当我试图为它动态分配内存时,遇到了一些错误。下面的代码在studArray处产生了错误"expression must be a modified lvalue",如标记的那样。

#ifndef MYCLASS_H
#define MYCLASS_H
#include "Student.h"
class myClass{
private:
Student* studArray[5];  
int howMany;
int max;
public:
myClass(){
Student firstOne;
studArray[0] = &firstOne; 
howMany=0;
max=5;
}//myClass()
void insertEl( Student* nextEl ){
howMany++;
if(howMany >= max){
Student** tempPt = new Student* [max + 1];
for( int i = 0; i < currentNum; i++){
tempPt[i] = studArray[i];       
}
delete [] studArray;
studArray = tempPt; //   <-------------------------error
}
studArray[ howMany ] = nextEl;
}//insertEl
};

我尝试将原始的Student*数组更改为未指定大小,但这在studArray处产生了错误"不允许不完整类型"。

class myClass{
private:
Student* studArray[]; <------------- error  
int howMany;
int max;

我做错了什么?(感谢您的帮助!)作为参考,我使用的是Win7 64位Visual Studio Professional 2012。

假设:讲师希望你自己学习记忆管理的艺术。所以没有库容器,也没有智能指针。当你有时间的时候,研究一下如何使用标准容器和智能指针。它们将在未来为你节省大量的时间和悲伤。

首先,声明Student数组。

Student* studArray[5];  

关键就在这里

Student** tempPt = new Student* [max + 1];

所以试试

Student** studArray;  

然后破解你的构造函数来分配存储

myClass()
{
max = 5;
studArray = new Student*[max]; /* For improved safety, read up on
exceptions, catch and handle the 
out of memory exception */
howMany = 0;
} //myClass()

我建议添加一个析构函数来处理清理并放回数组。

virtual ~myClass()
{
delete[] studArray;
}

查看作业笔记或指导老师,了解谁负责维护学生。在删除studArray之前,您可能需要重新访问析构函数以删除所有学生

附加说明:

myClass()
{
Student firstOne;
studArray[0] = &firstOne; 
howMany=0;
max=5;
}//myClass()

Student firstOne;是一个临时变量。CCD_ 3仅存在于最近的封闭CCD_ 4大括号之间。这被称为范围。使用任何超出其范围的值都会产生不可预测的结果,并且很可能导致程序崩溃。坦率地说,如果你运气好的话。程序可能会在一段不确定的时间内缓慢运行,然后崩溃。

分配studArray[0] = &firstOne;是危险的,因为当任何人尝试使用studArray[0]时,它所指向的数据将无效。firstOne不存在于构造函数之外。如果你想让firstOne继续存在,你必须把它定义为一个指针,用new创建它,当不再需要时用delete创建它。在这种情况下,我认为你永远都不需要它。

另一个建议是将studArray的大小增加一倍,而不是在其满时简单地添加一个。这样,您就不必像往常一样重新分配存储并将所有现有学生复制到新的存储中。

一个更好的方法是使用Studentstd::vectorstd::vector<Student *> maleStuds;
std::vector<Student *> femaleStuds;

或者,如果必须使用数组:

const unsigned int MAXIMUM_STUDENTS = 5;
Student * students[MAXIMUM_STUDENTS];

对于动态:

Student * * students = new Student * [MAXIMUM_STUDENTS];
相关文章: