在另一个结构中声明内部结构会导致错误:结构使用无效

Declaration of inner struct in another struct results in error: invalid use of struct

本文关键字:结构 错误 无效 另一个 声明 内部      更新时间:2023-10-16

这是我的第一个问题。我今年夏天开始学习C++,我对这部分代码有一点问题:

struct Contact{
char name[30];
char surname[50];
int age;
struct Born{
int day;
int month;
int year;
};
char mail[50];
};

好吧,我认为这部分代码还可以,但是我有这个功能来输入信息,我不知道我做错了什么。

Contact readContact(){
Contact c;
cout << "t            NAME: ";
cin.getline(c.name,30);
cout << "t         SURNAME: ";
cin.getline(c.surname,50);
cout << "t             AGE: ";
cin >> c.age;
cout << "t       BIRTHDATE:";
cin >> c.Born.day >> c.Born.month >> c.Born.year;
cout << "t           EMAIL: ";
cin.getline(c.mail,50);
cin.ignore();
return c;
}

我收到以下错误消息:

无效使用"结构 联系人::出生"|

也许这是一个简单的错误,但我是编码新手,我看不出我做错了什么。 :(

正如评论中提到的,符号Born是一种类型,就像Contact一样。

简单的解决方案是将结构声明为变量的匿名类型:

struct Contact{
char name[30];
char surname[50];
int age;
struct /* No type name here */ {
int day;
int month;
int year;
} Born;  // Member variable name here
char mail[50];
};

您可以将内部结构定义为匿名类型:

struct Contact
{
char name[30];
char surname[50];
int  age;
struct /* anonymous */
{
int day;
int month;
int year;
} Born; /* member name */
char mail[50];
};

这意味着内部结构没有显式类型(它是匿名的(,因此您无法在其他代码中声明该内部匿名类型的变量。

要允许使用内部结构,您可以将它们分开:

struct Born_s
{
int day;
int month;
int year;
};
struct Contact
{
char   name[30];
char   surname[50];
int    age;
Born_s Born;
char   mail[50];
};

或者在结构内部给它一个类型名称(内部类型的用法:Contact::Born_s(,如:

struct Contact
{
char name[30];
char surname[50];
int  age;
struct Born_s /* inner type name: Contact::Born_s */
{
int day;
int month;
int year;
} Born; /* member name */
char mail[50];
};

正如其他人所指出的Born正如您所声明的那样,它是一个类型而不是成员。但是您可以使用它来声明成员,如下所示:

struct Contact{
char name[30];
char surname[50];
int age;
struct Born{
int day;
int month;
int year;
};
Born birthDate; //<- member declaration using Contact::Born as a type
char mail[50];
};

这很有用,因为您可以稍后将类型(例如(用作函数参数:

struct Contact {
// ... member decleration
void setBirthDate(Born newDate) {
birthDate = newDate;
}
};