如何实现对象指针的动态数组? "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::vectorStudentstd::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 的大小增加一倍,而不是在它已满时简单地添加一个。这样您就不必经常重新分配存储并将所有现有学生复制到新存储。