将对象数组传递给函数

时间:2020-09-03 15:49:30

标签: c++ arrays function class object

我有一个类,将object.name定义为“ Ben”,而object.favNum定义为25。

我也有一个数组(名称)来存储5个此类的对象。

在输出数组中对象的属性之前,请使用指针符号将名称[0] .name的值更改为“ Jim”,将名称[0] .favNum的值更改为40。

这是我的代码:

#include<iostream>

class Person {
public:
    std::string name = "Ben";
    int favNum = 25;
};


int main()
{
    Person names[5];

    Person *ptr = &names[0];


    // Changing Values
    (ptr + 0)->name = "Jim";
    (ptr + 0)->favNum = 40;


    for (int i = 0; i < 5; i++) 
    {
        std::cout << (std::string) (ptr + i)->name   << std::endl;
        std::cout << (int) (ptr + i)->favNum << std::endl << std::endl;
    }

    system("pause>0");
}

输出:

Jim
40

Ben
25

Ben
25

Ben
25

Ben
25

在有“更改值”注释的地方,我想用一个函数替换这两行。 该函数将能够像我对两行所做的那样更改值。 这是我遇到的问题。

我正在努力弄清楚将函数声明为哪种类型,如何传递指针,如何接收指针以及如何更改函数数组中对象的值。

2 个答案:

答案 0 :(得分:0)

除非您确实需要指针,否则我建议不要使用指针。

// use references instead
void change(Person &person) {
    person.name = "Jim";
    person.favNum = 40;
};

int main()
{
    Person names[5];

    change(names[0]);

    // ...
}

编写此类函数的适当方法是使用引用。引用类似于指针,但绝对不能为nullptr。就您而言,您不需要可为空性,只需要编辑Person而不复制它即可。

您可能希望change()参数化:

// use references instead
void change(Person &person, std::string name, int favNum) {
    person.name = std::move(name);
    person.favNum = favNum;
}

但是现在您正在使用此功能分配Person的所有成员,这使其毫无意义。如果您分配了Person,将会更简单。为什么不使用struct和聚合初始化:

struct Person {
    std::string name = "Ben";
    int favNum = 25;
};

int main()
{
    Person names[5];

    names[0] = {"Jim", 40};

    // ...
}

顺便说一句,您在这里所做的事情没有必要很复杂:

(ptr + 0)->name = "Jim";

// this is equivalent to
ptr[0].name = "Jim";

// this is equivalent to
ptr->name = "Jim";

答案 1 :(得分:0)

这是您的代码在“ real” c ++中的外观(值的设置将在构造函数中或使用setNameAndFavNum()函数进行):

#include <array>
#include <iostream>

struct Person {
public:
    Person(const std::string& name_ = "Ben", int favNum_ = 25) : name(name_), favNum(favNum_) {};
    void setNameAndFavNum(const std::string& name_, int favNum_) {
        name = name_;
        favNum = favNum_;
    };

    std::string name;
    int favNum;
};    

int main() {
    std::array<Person, 5> names;


    // Changing Values
    names[0].setNameAndFavNum("Jim", 40);

    // Alternatively you can use the constructor and implicit copy constructor
    // names[0] = {"Jim", 40};

    for (int i = 0; i < names.size(); i++)  {
        std::cout << names[i].name << std::endl;
        std::cout << names[i].favNum << std::endl << std::endl;
    }
}

在编写c ++代码时,您不应弄乱指针和原始值。