使用C++引用类数组的元素

Referencing Elements of Class Arrays using C++

本文关键字:元素 数组 C++ 引用 使用      更新时间:2023-10-16

我正在尝试使用指针切换类数组的元素。它不是在输出我想要的东西。我尝试在函数中使用指针,但这是不允许的。也不允许在不使用指针的情况下将函数调用到类对象上,因为我使用双指针声明了类对象。我使用这种方法并不是为了简单地解决一个小问题,而是为了练习使用这种方法解决更难的问题。

这是我的代码:

#include <iostream>
#include <algorithm>
using namespace std;
class thing{
public:
    int index;
    int value;
    thing();
private: int number;
};
thing::thing()
{
    number = 0;
}
void arrange(thing array[]){
    for(int i=0; i<19; ++i){
        if(array[i].value<array[i+1].value){
            swap(array[i], array[i+1]);
            arrange(array);
        }
    }
}
int main(){
    thing** things = new thing*[20];
    for (int i=0; i < 20; ++i)
    {
        things[i] = new thing();  // default constructor
        things[i]->index = i;
        things[i]->value=rand() % 100;
    }
    cout << "The random array is: " << endl;
    for(int i=0;i<20;++i){
        cout << things[i]->value << endl;
    }
    arrange(*things);
    cout << "The arranged array is: " << endl;
    for (int i=0; i < 20; ++i)
    {
        cout << things[i]->value << endl;
    }
    return 0;
}

当您调用arrange(*things)时,您只是将things的第一个元素传递给函数,而不是数组。应该是array(things)。然后arrange函数应该被编写为使用指针:

void arrange(thing* array[]){
    for(int i=0; i<19; ++i){
        if(array[i]->value<array[i+1]->value){
            swap(array[i], array[i+1]);
            arrange(array);
        }
    }
}

在这里创建指向thing:的指针数组

thing** things = new thing*[20];

在这里,您可以取消引用它,并获得一个指向thing的指针,该指针存储在thing[0]:中

arrange(*things);

但是这个函数声明

void arrange(thing array[])

将该指针视为thing的数组,因此*things指向它的第一个元素,这绝对不是它的实际情况


您应该更改arrange()函数以使用正确的类型:

void arrange(thing* array[]){
    for(int i=0; i<19; ++i){
        if(array[i]->value<array[i+1]->value){
            swap(array[i], array[i+1]);
            arrange(array);
        }
    }
}

并称之为:

arrange(things);

关于使用向量,您根本不需要使用任何指针。

std::vector<thing> things(20);
for (int i=0; i < things.size(); ++i)
{
    things[i].index = i;
    things[i].value=rand() % 100;
}
arrange(things);

void arrange(std::vector<thing>& array){
    for(int i=0; i + 1 < things.size(); ++i){
        if(array[i].value<array[i+1].value){
            swap(array[i], array[i+1]);
            arrange(array);
        }
    }
}