[英]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.