【问题标题】:Pointer "does not have a type" when compiling?编译时指针“没有类型”?
【发布时间】:2013-09-24 22:27:48
【问题描述】:

这是我的代码。

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

当我编译时,它说“错误:'id' 没有命名类型”,指向指针被分配 5 个整数空间的行。

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

【问题讨论】:

  • @Kerrek SB:除了这个语法不是内联初始化器的正确语法。
  • 今天的方法是std::array<int, 5> id,你的老师仍在使用真正属于20世纪的技术。
  • 什么是内联初始化器?
  • @AndreyT: 哦,当然……

标签: c++ arrays pointers memory dynamic


【解决方案1】:

您是如何提出此代码的,您希望它做什么?

这一行

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]) 
    {}
  ...
};

(当然,此类的正确实现需要遵循三法则。)

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

【讨论】:

  • 尽管在std::array 可能不存在的情况下我更倾向于这样做,除非 OP 明确声明要在 player's dtor 之外处理销毁,我建议您添加适当的实现。跨度>
  • @thokra:不。OP 明确表示这是一项“培训”任务。虽然我无法完全猜出他们想要学习什么,但原始语法建议分配一个由结构中的指针引用的独立数组。同时,std::array 将实现一个“嵌入式”数组,这是完全不同的事情。 std::array 只是更文明一点的 int id[5]。由于他们从一开始就没有使用int id[5],我认为std::array 也不是“适当的实现”。
  • @thokra:很可能暗示在一般情况下,数组大小不会由编译时间常数指定,这就是他们在运行时分配它的原因。这将立即将std::array 排除在考虑之外。在这种情况下,原始数组的正确替换是std::vector,而不是std::array。但是,无论如何,我不想因为极度缺乏信息而使我的答案变得混乱。我只是直接回答问题本身。
  • 关于std::array,您是正确的。我的坏,没有想到。但是,我正在谈论将类型的析构函数的适当实现放在那里,即调用 delete[] 的析构函数。我不认为这是一个糟糕的猜测。但同样,OP 并没有说明清理应该由类型本身处理。
【解决方案2】:

试试这个:

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

【讨论】:

  • 我愿意,但必须为此程序声明所有使用动态分配的数组。因此,我不能那样声明数组。
  • @user1362548:请参阅下面 AndreyT 的答案。
【解决方案3】:

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

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

a.id = new int[5];

里面就像另一个答案:

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

【讨论】:

  • 结构中不能有语句
  • 另外,这不是初始化。当您可以为 player 实例的成员赋值时,int* 将已被“垃圾”初始化,即具有未定义的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多