C++ 使用带有对象的数组调用类中的方法,错误“0”;“非类类型”;,c++;

C++ 使用带有对象的数组调用类中的方法,错误“0”;“非类类型”;,c++;,c++,arrays,class,methods,C++,Arrays,Class,Methods,这是我的第一篇帖子,我只想首先对这个社区说声谢谢,它帮助了我很多次,你们太棒了:) 不幸的是,我还没有找到这个问题的答案。虽然我自己解决了我的问题,但我不明白我的代码是如何工作的以及为什么工作的 所以这篇文章是为所有和我有同样问题的人写的,他们正在寻找解决办法。但是,这也是一个问题,因为我不明白为什么这个解决方案有效。因此,我最感兴趣的是学习它是如何工作的以及为什么工作的,这样我就可以在将来的编码中实现它:) 这是我的代码: #include <iostream> #include

这是我的第一篇帖子,我只想首先对这个社区说声谢谢,它帮助了我很多次,你们太棒了:)

不幸的是,我还没有找到这个问题的答案。虽然我自己解决了我的问题,但我不明白我的代码是如何工作的以及为什么工作的

所以这篇文章是为所有和我有同样问题的人写的,他们正在寻找解决办法。但是,这也是一个问题,因为我不明白为什么这个解决方案有效。因此,我最感兴趣的是学习它是如何工作的以及为什么工作的,这样我就可以在将来的编码中实现它:)

这是我的代码:

#include <iostream>
#include <cstdlib>

using namespace std;

const int number=4;

class Person
{
public:
string name;
int age;
void setInfo(string _name, int _age)
{
    name=_name;
    age=_age;
}
void Print(Person* family, int number) //This is the method I had a problem with
{
    for (int i=0; i<number; i++)
    {
    cout<<family[i].name<<" is "<<family[i].age<<" years old"<<endl;
    }
}
};

int main()
{
Person family[number]; //Creating an array/vector to put my objects in

for (int i=0; i<number; i++) //The user creates people for a family of 4
{

    string name;
    int age;

    cout<<"Name on person number "<<i+1<<": ";
    getline(cin,name);

    cout<<"How old is the person: ";
    cin>>age;
    cout<<endl;
    cin.get();

    family[i].setInfo(name, age); //Here I am using a . and it works just fine
}

family->Print(family, number); //Works!

    //family.Print(family, number); This does not work.  
    //Errormessage: request for member 'Print' in 'family', which is of 
    //non-class type 'Person [4]'

return 0;
}
#包括
#包括
使用名称空间std;
常数整数=4;
班主任
{
公众:
字符串名;
智力年龄;
void setInfo(字符串_name,int _age)
{
名称=_名称;
年龄=_年龄;
}
void Print(Person*family,int number)//这是我遇到问题的方法
{

因为(int i=0;i你的
家族->打印(家族,数字)
之所以有效,是因为家族是一个数组,数组名称充当指向它的第一个元素的指针。所以基本上
家族->设置信息()
(&family[0])->设置信息()
是一样的。但是正如你的编译器所说,
家族
本身就是一个数组(或指向它的第一个元素的指针),而不是
,因此它没有这样的成员函数
setInfo()

family->Print
family[0]的意思相同。Print

问题是,
Print
不应该是一个非静态成员函数。它不使用任何成员变量,只对传入的参数进行操作


最简单的解决方案是将
void Print(Person*family,int number){..}
移动到
Person

数组名称(在您的例子中是“family”)的类定义之外始终是指向该数组第一个元素的指针。

这只是因为
family
是一个数组,而arrays name是指向int的第一个元素的指针。因此基本上
family->setInfo()
(&family[0])->setInfo()相同
。如果使用
std::vector
;更少的锐边,你会感觉更好。名称可以转换为这样的指针,但这并不总是发生嗯…我认为在C中这是一条规则。在这种情况下不会发生?当将数组绑定到引用时,或者当使用
sizeof
&
,以及其他一些情况下,你是r好吧……我收回“永远”这个词:但在这种情况下,规则是适用的。当然,但我的作业/老师特别要求我们在类内创建Print函数。@Elola也许你应该让
Print
函数没有参数,只打印该成员,然后在循环中调用它。现在的方式是糟糕的设计。另一个选项是将其设置为
静态
如何在没有参数的情况下执行此操作?该方法必须打印类中的所有对象,以创建用户输入的所有家庭成员的列表。可能您误解了要求。我认为我现在理解了您的意思,并改为执行此操作(去掉参数)。
void print(){cout