【问题标题】:C++ - Incomplete type not allowed while declaring struct and class [duplicate]C ++ - 声明结构和类时不允许不完整类型[重复]
【发布时间】:2019-03-03 05:32:33
【问题描述】:

我正在尝试定义一个具有该类型元素的类。用更好的话来说:

class Cell {
public:
    int row;
    int col;
    Cell parent;
};

我在 Visual Studio 下工作,parent 带有错误下划线:incomplete type is not allowed。我相信这是因为我引用了一些尚未完成声明的东西。所以我尝试做一些不同的事情,将它定义为一个类型:

typedef struct s_cell {
    int row;
    int col;
    struct s_cell parent;
} Cell;

我遇到了同样的问题。我确定是出于同样的原因。

【问题讨论】:

  • 如果你把Cell放在Cell里面,那么Cell也将包含一个Cell,而Cell又包含一个Cell。 ......等等......不是吗?
  • 一个类(或结构)可以包含一个指针,指向同类型的类(或结构),但不能包含同类型的实例,因为那样会导致无限递归。
  • @user3386109 成功了,谢谢

标签: c++ c class typedef incomplete-type


【解决方案1】:

为了回答您的问题,我们假设这是允许的。 (为了简单起见,并且因为它是我更熟悉的,我将使用 C struct 案例作为示例。C++ 案例是相同的,如果您使用的是 @ 则交换关键字987654322@ 代替。)

struct 类型的变量与struct 的所有成员一样大。因此,假设您有以下内容:

struct foo {
  int x;
  int y;
};

假设 int 是 4 个字节(在许多现代平台中的常见假设),struct foo 类型的变量在内存中占用 8 个字节(两倍 4,因为它包含两个 int 成员)并包含两个整数在里面。

现在,让我们这样做:

struct bar {
  int a;
  int b;
  struct bar another; // "bar another;" would be OK in C++, not in C
};

所以struct bar 变量将是……多长时间?每个int 有 4 个,所以 8 个,加上...它自己的大小,因为它包含自己的 副本。所以sizeof(struct bar) == 8 + sizeof(struct bar)。这没有意义。 struct 的内容也没有意义——它包含两个 int 成员,然后......另一个 struct bar 和另外两个,其中包含 又一个 struct bar 和还有两个,以此类推无限。你最终会遇到无限递归的情况。

在这种情况下,您可能想要做的是有一个 指针 指向另一个 struct bar,它可能为空,也可能不为空:

struct bar {
  int a;
  int b;
  struct bar * another;
};

这具有明确定义的内容(两个int 成员和一个指针成员),具有明确定义的大小(例如,16 字节,假设指针占用 8 个字节)。

回到你的牢房,你会有:

class Cell {
public:
  int row;
  int col;
  Cell * parent;
};

现在不是不完整类型,而是指向不完整类型的指针,这是允许的。 (考虑void,定义为不完整类型,void *,因此是指向不完整类型的指针。您永远不能将前者用作成员的类型,但您始终可以使用后者。)

事实上,至少有一个单元格没有父单元; something 可能是所有细胞的根和祖先。该单元格将具有nullptr 作为parent 的值。

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多