如何在没有硬编码的情况下以C++为单位获取类数组的长度?

How to get the length of a class array in C++, without hardcoding?

本文关键字:获取 为单位 数组 C++ 情况下 编码      更新时间:2023-10-16

我在C++中有一个类数组。我这样定义它:

Student* pliststudent = new Student[2]{ 3,5 };

我知道当我们将其分配给Student* pliststudent时,类数组会衰减成指针。

如果不对其进行硬编码,就很难提取类数组的长度。

我实现了代码,使其不是硬编码的(使用友元函数(。但我认为,必须存在更好的解决方案。

以下是我的完整代码:

class Student
{
private:
int marks;
int counter=0;
public:
Student(int marks) : marks(marks)
{}
int FinalMarks()
{
marks *=2;
return marks;
}
friend int Length(Student ob1, Student ob2);
};
int Length(Student ob1, Student ob2)
{
int i = ++ob1.counter + ++ob2.counter;
return i;
}
int main()
{
Student* pliststudent = new Student[2]{ 3,5 };
//int length = sizeof(*pliststudent) / sizeof(pliststudent[0]); //This does not work.
int length = Length(pliststudent[0], pliststudent[1]);
for (int i = 0; i < length; i++)
{
cout << (pliststudent+i)->FinalMarks() << endl;
}
return 0;
}

有没有更好的解决方案?我不想对学生类数组的大小进行硬编码。

不能从指向数组第一个元素的指针获取数组的长度。 当数组衰减到指针时,该信息将丢失。

您需要将长度信息保存在某个地方,或者您自己:

int length = 2;
Student* pliststudent = new Student[length]{ 3,5 };

或者使用为您跟踪长度的容器:

std::vector<Student> students{3, 5};
// students.size() returns the number of Student objects in the vector

现场演示

如果必须使用动态数组,则无法自动确定数组的大小。当您像以前一样将数组存储在指针中时,该信息会"丢失"。

有几种方法可以解决此问题,首选方法是评论中已经建议的方法,请改用std::vector<Student>。Vector 是标准库的动态数组,几乎总是您想要的。而且由于它会自动处理内存管理,因此使用起来要简单得多。

但是,如果您必须使用动态数组(因为这是学校作业并且不允许使用std::vector(,那么您应该将数组的大小存储在单独的变量中,并将其与您需要执行的任何操作一起传递。

const int nStudents = 2;
Student* pliststudents = new Student[nStudents]{3, 5};