如何在不进行硬编码的情况下在 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&lt;Student&gt; 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&lt;Student&gt;。 Vector 是标准库的动态数组,几乎总是你想要的。而且由于它会自动处理内存管理,因此使用起来要简单得多。

但是,如果你必须使用动态数组,(因为这是一个学校作业,你不能使用std::vector),那么你应该将数组的大小存储在一个单独的变量,并将其与您需要做的任何事情一起传递。

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

【讨论】:

以上是关于如何在不进行硬编码的情况下在 C++ 中获取类数组的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]

有没有办法在不硬编码的情况下获取键盘键列表及其各自的键码?

如何在不使用某些框架的情况下在 php 中进行 MVC

如何在不使用全局变量的情况下在 bash 中返回一个数组?

如何在不使用 getline 的情况下在 C++ 中将输入字符串直到行尾

如何在不使用 C++ 中的 RegDeleteKeyEx 的情况下在 64 位树中删除 Windows x64 中的注册表项?