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

时间:2017-08-17 13:08:54

标签: c++ struct

这是我的第一个问题。我今年夏天开始学习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;
}

我收到以下错误消息:

  

无效使用'struct Contact :: Born'|

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

3 个答案:

答案 0 :(得分:6)

正如评论中所述,符号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];
};

答案 1 :(得分:2)

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

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];
};

答案 2 :(得分:1)

正如其他人已经指出 # Statement 2 list2 = [i for int(i) in list1.split(' ')] 所声明的那样,是一种不是成员的类型。但你可以用它来声明一个像这样的成员:

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];
};