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