如何在没有硬编码的情况下以C++为单位获取类数组的长度?
How to get the length of a class array in C++, without hardcoding?
我在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};
相关文章:
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 可视化 如何获取图像中像素的颜色(以C++ (sfml) 为单位)
- 在Windows上获取OpenGL点大小(以像素为单位)?
- 仅使用C++中的标准库获取以毫秒为单位的当前日期和时间
- 如何使用闰秒以微秒为单位获取 UTC 时间
- 获取C++模板参数包的总大小(以字节为单位)
- tiny-utf8:以字符/代码点为单位获取偏移量
- 使用 c++ 获取两个日期与时间字符串之间的差异(以秒为单位)
- 如何在C++中以毫秒为单位获取今天的 UTC 午夜时间?
- 如何在跨平台 c++ 32 位系统中获取以毫秒为单位的时差
- 获取字符串的长度(以C++为单位)
- C++-获取以整数位为单位的大小
- 获取系统时间(以毫秒为单位)作为int/double
- 如何获取自C++纪元 (MSVS) 以来的本地当前时间(以秒为单位)
- 如何从1970年1月1日(C++)开始获取当前系统时间(以毫秒为单位)
- 以 C++ 为单位获取当前时间(以月/日/年为单位)
- 如何以毫秒为单位获取自 1970 年以来的当前时间戳,就像 Java 一样
- 在 c++ 中获取以毫秒为单位的时差