如何在不进行硬编码的情况下在 C++ 中获取类数组的长度?
Posted
技术标签:
【中文标题】如何在不进行硬编码的情况下在 C++ 中获取类数组的长度?【英文标题】:How to get the length of a class array in C++, without hardcoding? 【发布时间】:2020-01-01 18:50:33 【问题描述】:我在 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;
有没有更好的解决方案?我不想硬编码 Student 类数组的大小。
【问题讨论】:
改用std::vector
。
std::vector<Student> pliststudent = 3, 5;
。一旦你这样做了,那么这些“长度”计算都不是必需的,也不需要 friend
函数的恶作剧。
我完全不明白Length
函数的用途。如果仅在对象上使用一次,它将始终输出2
。否则,它会返回与数组长度完全无关的较大值。
【参考方案1】:
您无法从指向数组第一个元素的指针中获取数组的长度。当数组衰减为指针时,该信息会丢失。
您需要自己保存长度信息:
int length = 2;
Student* pliststudent = new Student[length] 3,5 ;
或使用为您跟踪长度的容器:
std::vector<Student> students3, 5;
// students.size() returns the number of Student objects in the vector
Live Demo
【讨论】:
【参考方案2】:如果必须使用动态数组,则无法自动确定数组的大小。当您将数组存储在指针中时,该信息会“丢失”。
有几种方法可以解决这个问题,首选的方法是 cmets 中已经建议的方法,请改用 std::vector<Student>
。 Vector 是标准库的动态数组,几乎总是你想要的。而且由于它会自动处理内存管理,因此使用起来要简单得多。
但是,如果你必须使用动态数组,(因为这是一个学校作业,你不能使用std::vector
),那么你应该将数组的大小存储在一个单独的变量,并将其与您需要做的任何事情一起传递。
const int nStudents = 2;
Student* pliststudents = new Student[nStudents]3, 5;
【讨论】:
以上是关于如何在不进行硬编码的情况下在 C++ 中获取类数组的长度?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]
如何在不使用 getline 的情况下在 C++ 中将输入字符串直到行尾
如何在不使用 C++ 中的 RegDeleteKeyEx 的情况下在 64 位树中删除 Windows x64 中的注册表项?