繁体   English   中英

将对象数组传递给函数

[英]Passing an Array of Objects into a Function

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

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

在输出数组中对象的属性之前,我使用指针表示法将 names[0].name 的值更改为“Jim”,将 names[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 行所做的那样更改这些值。 这是我遇到问题的地方。

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

我建议不要使用指针,除非你真的需要指针。

// 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";

这是您的代码在“真实” 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++ 代码时,您不应该乱用指针和原始值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM