Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针;没有类型“;什么时候编译?_C++_Arrays_Pointers_Memory_Dynamic - Fatal编程技术网

C++ 指针;没有类型“;什么时候编译?

C++ 指针;没有类型“;什么时候编译?,c++,arrays,pointers,memory,dynamic,C++,Arrays,Pointers,Memory,Dynamic,这是我的密码 struct player { char* name; int* id; id = new int[5]; }; 当我编译时,它说“error:'id'没有命名类型”,指向指针被分配了5个整数空间的那一行 不要问我为什么需要整数数组;这是一个课堂项目,是必需的(我们的老师喜欢让我们做一些不必要的事情来练习)。试试这个: struct player { char *name; int id[5]; }; 试试这个: struc

这是我的密码

struct player
   {
   char* name;
   int* id;
   id = new int[5];
   };
当我编译时,它说“error:'id'没有命名类型”,指向指针被分配了5个整数空间的那一行

不要问我为什么需要整数数组;这是一个课堂项目,是必需的(我们的老师喜欢让我们做一些不必要的事情来练习)。

试试这个:

struct player
   {
   char *name;
   int id[5];
   };
试试这个:

struct player
   {
   char *name;
   int id[5];
   };

不能在结构中键入代码行。 您只定义变量。struct希望您正在定义一个新变量。因此,错误表示id不是int和char之类的类型定义

如果坚持使用指针,您可以在结构之外进行初始化

a.id = new int[5];

就像另一个答案一样:

struct player
{
   char *name;
   int id[5];
};

不能在结构中键入代码行。 您只定义变量。struct希望您正在定义一个新变量。因此,错误表示id不是int和char之类的类型定义

如果坚持使用指针,您可以在结构之外进行初始化

a.id = new int[5];

就像另一个答案一样:

struct player
{
   char *name;
   int id[5];
};

你是怎么想出这个代码的?你希望它做什么

这条线

id = new int[5];
看起来像一个表达式语句。这个语句在类定义中做什么?表达式语句属于函数内部,而不属于其他任何地方。不允许将它们注入类定义中。他们不属于那里。这就是编译器通过该错误消息告诉您的:它期望下一个成员声明有一个类型名,相反,它看到的是以
id
开头的内容,在该上下文中通常没有意义

如果您试图使用内联初始值设定项,正确的语法应该是

struct player
{
  char* name;
  int* id = new int[5];
};
初始值设定项必须是声明的一部分,如上所示。您不能将其拆分为单独的语句,将其填充到类定义中,然后期望编译器理解您的意思

否则(即,如果您没有尝试使用内联初始值设定项),则必须在构造函数中初始化
player::id

struct player
{
  char* name;
  int* id;

  player(): id(new int[5]) 
    {}
  ...
};
(当然,要正确实现这一类,需要遵循三个规则。)


或者您可以从外部初始化它。什么是正确的方法取决于您的意图。

您是如何想出这段代码的?您希望它做什么

这条线

id = new int[5];
看起来像一个表达式语句。这个语句在类定义中做什么?表达式语句属于函数内部,而不属于其他任何地方。不允许将它们注入类定义中。他们不属于那里。这就是编译器通过该错误消息告诉您的:它期望下一个成员声明有一个类型名,相反,它看到的是以
id
开头的内容,在该上下文中通常没有意义

如果您试图使用内联初始值设定项,正确的语法应该是

struct player
{
  char* name;
  int* id = new int[5];
};
初始值设定项必须是声明的一部分,如上所示。您不能将其拆分为单独的语句,将其填充到类定义中,然后期望编译器理解您的意思

否则(即,如果您没有尝试使用内联初始值设定项),则必须在构造函数中初始化
player::id

struct player
{
  char* name;
  int* id;

  player(): id(new int[5]) 
    {}
  ...
};
(当然,要正确实现这一类,需要遵循三个规则。)



或者您可以从外部初始化它。正确的方法取决于您的意图。

结构中不能有语句。此外,这不是初始化。当您可以将值分配给
player
实例的成员时,
int*
将已被“垃圾”初始化,即将有一个未定义的值。结构中不能有语句。此外,这不是初始化。当您可以将值分配给
player
实例的成员时,
int*
将已经被“垃圾”初始化,即将有一个未定义的值。@Kerrek SB:除了此语法不是内联初始值设定项的正确语法之外。今天的方法将是
std::array id
,你的老师仍然在使用20世纪的技术。什么是内联初始值设定项?@AndreyT:d'oh,当然…@Kerrek SB:除了这种语法不是内联初始值设定项的正确语法。今天的方法是
std::array id
,你的老师仍然在使用20世纪的技术。什么是内联初始值设定项?@AndreyT:d'oh,当然……我会的,但必须为这个程序声明所有使用动态分配的数组。因此,我不能这样声明数组。@user1362548:请参阅下面AndreyT的回答。我会,但必须使用动态分配声明此程序的所有数组。因此,我不能这样声明数组。@user1362548:请参见下面AndreyT的回答。尽管我倾向于在可能没有
std::array
的情况下这样做,除非OP明确声明销毁将在
玩家的
dtor之外处理,我建议您添加适当的实施。@thokra:不。OP明确表示这是一项“培训”任务。虽然我不能完全猜出他们想要学习什么,但原始语法建议使用一个分配的独立数组,该数组由结构中的指针引用。同时,
std::array
将实现一个“嵌入式”数组,这是完全不同的事情
std::array
只是比
intID[5]
稍微文明一点。由于他们从一开始就没有使用
int-id[5]
,我认为
std::array
也不是“适当的实现”。@thokra:很可能这意味着在一般情况下,数组大小不会由编译时常量指定,这就是为什么他们在运行时分配它。这将立即从考虑中排除
std::array
。在这种情况下,正确的回答是