gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:38 25 4
gpt4 key购买 nike

我是一名 C++ 学生,这是我在这里发表的第二篇文章。我正在研究一个类,它的工作是维护一个对象指针数组。 (这样可以传入一个指针并将其添加到数组中,而不是整个对象。)该数组应该是动态的,但是当我尝试为其动态分配内存时遇到了一些错误。以下代码在 studArray 处产生错误“expression must be a modifiable 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;

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

最佳答案

假设:教师希望您自己学习内存管理的艺术。所以没有库容器也没有智能指针。有空的时候,看看如何使用标准容器和智能指针。它们会在未来为您节省大量时间和痛苦。

首先,声明学生数组。

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

之前,您可能必须重新访问析构函数以删除所有 Students

补充说明:

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

Student firstOne; 是一个临时变量。 firstOne 仅存在于最近的封闭 {} 大括号之间。这称为作用域。在其范围之外使用任何值都会产生不可预知的结果,并且很可能使程序崩溃。坦率地说,如果你幸运的话。该程序可能会在不确定的时间内运行并在稍后崩溃。

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

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

关于c++ - 如何实现对象指针的动态数组? "expression must be a modifiable lvalue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29836542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com