0

我正在尝试修改一些代码,以便在我的 mysh.cpp 文件中包含和使用双向链表,我得到了

error: aggregate ‘linked_list list’ has incomplete type and cannot be defined

在编译。readcommand.cpp 编译得很好,所以我只是想弄清楚头文件或 cpp 文件中需要更改的内容,以使其在 mysh 中顺利运行。

以下是使用的文件的相关部分:

mysh.cpp

#include "readcommand.h"

using namespace std;

int main (int argc, char** argv) {
  readcommand read;
  linked_list list; // THIS is the line that's causing the error

  ...
}

读取命令.h

#ifndef READCOMMAND_H
#define READCOMMAND_H

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>

class readcommand {

  public:

  // Struct Definitions
  typedef struct node node_t;
  typedef struct linked_list linked_list_t;

  struct node;
  struct linked_list;

...
};

#endif

读取命令.cpp

#include "readcommand.h"

using namespace std;

struct node {
  const char *word;
  node *prev;
  node *next;
};

struct linked_list {
  node *first;
  node *last;
};

...

自从我在 c++ 或一般语言中使用标题以来已经有一段时间了。我已经尝试将有问题的行更改为

read.linked_list list;

read.linked_list list = new linked_list;

等等,但它只是将错误更改为

error: ‘class readcommand’ has no member named ‘linked_list’

error: invalid use of ‘struct readcommand::linked_list’

提前谢谢。

4

4 回答 4

1

你需要把这些...

struct node {
  const char *word;
  node *prev;
  node *next;
};

struct linked_list {
  node *first;
  node *last;
};

...编译器在使用它们之前会看到它们的地方class readcommand。可能最简单的做法是将它们放在 readcommand.h before class readcommand中。问题是你正在使用它,node但编译器不知道它们在编译时是什么。linked_listclass readcommand

于 2013-02-24T07:33:03.987 回答
0

结构/类定义(而不仅仅是声明)需要在您使用时可见

  1. 取消引用指向该结构/类的指针
  2. 创建该结构/类的对象

编译器需要知道对象的大小及其字段的位置。

这就是为什么您可能希望将 node 和 linked_list 的定义放入 .h 文件的原因。通常,您只将成员函数的定义放入 .cpp。

于 2013-02-24T07:31:16.950 回答
0

linked_list在 cpp 文件中有定义...因此,如果包含 .h 文件,编译器将看不到该结构的定义。

将结构的定义移动到头文件。

于 2013-02-24T07:31:33.100 回答
0

在 readcommend.h

linked_list 是 readcommand 类的成员,您可以通过 readcommand 对象访问它,或者如果 readcommand.cpp 将linked_list 移动到 readcommand.h insead 以便编译器知道“它是什么”

于 2013-02-24T07:33:54.483 回答