如何实现对象指针的动态数组? "expression must be a modifiable lvalue"
How to implement a dynamic array of object pointers? "expression must be a modifiable lvalue"
我是一名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
的大小增加一倍,而不是在其满时简单地添加一个。这样,您就不必像往常一样重新分配存储并将所有现有学生复制到新的存储中。
一个更好的方法是使用Student
的std::vector
:std::vector<Student *> maleStuds;
std::vector<Student *> femaleStuds;
或者,如果必须使用数组:
const unsigned int MAXIMUM_STUDENTS = 5;
Student * students[MAXIMUM_STUDENTS];
对于动态:
Student * * students = new Student * [MAXIMUM_STUDENTS];
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- "expression must be a modifiable lvalue"是什么意思?
- unordered_set .find 方法无法编译的 C++ "expression must have class type"错误
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 调用 list.size() 方法给出错误"expression must have class type"
- 为什么我会收到"Expression must have a class type"错误?(C++)
- C++ 中数组的"expression must have pointer-to-object type"是什么?
- 当值不能恒定时如何修复"Expression must have a constant value"?
- 为什么我的某些数据成员"expression must be an lvalue or a function designator"收到此错误?
- 仅当链接函数 C++ 时,才会发生"Expression must have class type error"
- 我可以忽略"Intellisense: (E0028) expression must have a constant value"吗?
- 产生错误"expression must be a modifiable lvalue"
- 字符串初始化失败:"expression must have integral or unscoped enum type"
- 错误 - "expression must have a class type" - c++
- 获取此地址时出现"expression must be an l-value or function designator"错误
- "Expression must have class type"错误
- deque.push_front() 给出错误"expression must have class type"
- 使用 "this" 关键字时的"Error: expression must have a pointer type"
- 使用可变宏时获得"Error: #28: expression must have a constant value "
- 在 2D 阵列分配期间对 calloc 进行"expression must have (pointer-to) function type"