如何实现对象指针的动态数组? "expression must be a modifiable lvalue"
How to implement a dynamic array of object pointers? "expression must be a modifiable lvalue"
我是一名 C++ 学生,这是我第二次 post 来这里。我正在研究一个 class ,它的工作是维护一个对象指针数组。 (这样可以传入一个指针并将其添加到数组中,而不是整个对象。)
该数组应该是动态的,但是当我尝试为其动态分配内存时,我 运行 遇到了一些错误。以下代码在 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[=22= 处产生了错误 "incomplete type is not allowed" ].
class myClass{
private:
Student* studArray[]; <------------- error
int howMany;
int max;
我做错了什么?
(感谢您的帮助!)
作为参考,我使用的是 Win 7 64 位,Visual Studio Professional 2012。
更好的方法是使用 std::vector
的 Student
:
std::vector<Student *> maleStuds;
std::vector<Student *> femaleStuds;
或者,如果您必须使用数组:
const unsigned int MAXIMUM_STUDENTS = 5;
Student * students[MAXIMUM_STUDENTS];
对于动态:
Student * * students = new Student * [MAXIMUM_STUDENTS];
假设:教师希望您自己学习内存管理的艺术。所以没有库容器也没有智能指针。有空的时候,看看如何使用标准容器和智能指针。他们会在未来为您节省大量时间和痛苦。
首先,声明学生数组。
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;
是临时变量。 firstOne
仅存在于最近的封闭 {}
大括号之间。这称为作用域。在其范围之外使用任何值都会产生不可预知的结果,并且很可能使程序崩溃。坦率地说,如果你幸运的话。该程序可能会在不确定的时间内运行并在稍后崩溃。
赋值 studArray[0] = &firstOne;
是危险的,因为当任何人尝试使用 studArray[0]
时,它指向的数据将无效。 firstOne
在构造函数之外不存在。如果你想让 firstOne
继续活下去,你将不得不把它定义为一个指针,用 new
创建它,当不再需要它时 delete
它。在这种情况下,我认为您永远不需要它。
另一个建议是将 studArray
的大小增加一倍,而不是在它已满时简单地添加一个。这样您就不必经常重新分配存储并将所有现有学生复制到新存储。
我是一名 C++ 学生,这是我第二次 post 来这里。我正在研究一个 class ,它的工作是维护一个对象指针数组。 (这样可以传入一个指针并将其添加到数组中,而不是整个对象。) 该数组应该是动态的,但是当我尝试为其动态分配内存时,我 运行 遇到了一些错误。以下代码在 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[=22= 处产生了错误 "incomplete type is not allowed" ].
class myClass{
private:
Student* studArray[]; <------------- error
int howMany;
int max;
我做错了什么? (感谢您的帮助!) 作为参考,我使用的是 Win 7 64 位,Visual Studio Professional 2012。
更好的方法是使用 std::vector
的 Student
:
std::vector<Student *> maleStuds;
std::vector<Student *> femaleStuds;
或者,如果您必须使用数组:
const unsigned int MAXIMUM_STUDENTS = 5;
Student * students[MAXIMUM_STUDENTS];
对于动态:
Student * * students = new Student * [MAXIMUM_STUDENTS];
假设:教师希望您自己学习内存管理的艺术。所以没有库容器也没有智能指针。有空的时候,看看如何使用标准容器和智能指针。他们会在未来为您节省大量时间和痛苦。
首先,声明学生数组。
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;
是临时变量。 firstOne
仅存在于最近的封闭 {}
大括号之间。这称为作用域。在其范围之外使用任何值都会产生不可预知的结果,并且很可能使程序崩溃。坦率地说,如果你幸运的话。该程序可能会在不确定的时间内运行并在稍后崩溃。
赋值 studArray[0] = &firstOne;
是危险的,因为当任何人尝试使用 studArray[0]
时,它指向的数据将无效。 firstOne
在构造函数之外不存在。如果你想让 firstOne
继续活下去,你将不得不把它定义为一个指针,用 new
创建它,当不再需要它时 delete
它。在这种情况下,我认为您永远不需要它。
另一个建议是将 studArray
的大小增加一倍,而不是在它已满时简单地添加一个。这样您就不必经常重新分配存储并将所有现有学生复制到新存储。